[。android.os.TransactionTooLargeException,当使用巨型回收视图时

问题描述 投票:1回答:1

我的主要活动有时会遇到这个令人讨厌的异常。堆栈跟踪是这样的:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.tomatedigital.lottogram, PID: 4430
    java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 543588 bytes
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4156)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: android.os.TransactionTooLargeException: data parcel size 543588 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:761)
        at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:5147)
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4148)
        at android.os.Handler.handleCallback(Handler.java:789) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6944) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

跟踪本身不是很有帮助,因为它没有指定与异常相关的组件或事务ID或标记(Google请考虑您放置在此处的废话的可调试性)...但我确实怀疑这是我主要活动中的recycleview。

此资源回收视图可能超载,数千个项目。它们每个都包含:3个小字符串,1个大字符串和一个小位图。

当此recyclerview超载且活动被暂停时,将引发此异常。由于创建了recyclerview,它会放大layout.xml,因此android会自动保存其状态。

是否有任何简便的方法来解决此问题?是否可以将应用设置为允许“超大交易”?我该怎么办?

================更新===================提供有关我的活动的附加信息

 @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        outState.putSerializable("media", this.media); //this is a domain class
        outState.putBoolean("canceled", this.canceled);
        outState.putInt("speed", this.speed);
        outState.putLong("startTime", this.startTime);
        outState.putSerializable("comments", (Serializable) this.adapter.getList()); //this is the large data
        outState.putBoolean("commentLoadComplet", this.complete);
        outState.putSerializable("fetched", (Serializable) this.fetched);
        outState.putSerializable("igiboAttendees", (Serializable) this.igiboAttendees);
        outState.putLong("winnerId", this.winnerId);

        super.onSaveInstanceState(outState);
    }
android android-recyclerview recycler-adapter android-transitions parcel
1个回答
0
投票

这通常是由于将大量数据保存在onSaveInstanceState中,不仅是针对发生异常的活动,还包括当前在后堆栈中的其他活动。

一种解决方案是使用ViewModel类来维护状态,而不是onSaveInstanceState:

ViewModel Overview

您仍然可以使用onSaveInstanceState处理少量数据,但是请记住,它会加总所有活动。

© www.soinside.com 2019 - 2024. All rights reserved.