AndroidX:仅在Android版本10设备中,Parcelable遇到IOException编写可序列化对象 [英] AndroidX : Parcelable encountered IOException writing serializable object only in Android version 10 devices

查看:114
本文介绍了AndroidX:仅在Android版本10设备中,Parcelable遇到IOException编写可序列化对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到了Parcelable encountered IOException writing serializable object,它是仅在Android版本10设备中由java.io.NotSerializableException: androidx.appcompat.widget.Toolbar错误引起的.

I got Parcelable encountered IOException writing serializable object and it caused by java.io.NotSerializableException: androidx.appcompat.widget.Toolbar error only in Android Version 10 devices.

我搜索了很多结果来找到该问题的解决方案,但是我得到的每个解决方案都要求在内部类内部子类中定义implement serializable而且我已经做到了,但仅在Android版本10设备上才出现此错误.

I've searched many results for getting solutions to this problem but every solution I got, was telling to define implement serializable in both inner class and sub inner class and I've done it, still, I got this error only in Android version 10 devices.

如果我将使用transient这个关键字定义视图"或对象",则此错误将得到解决,但是另一个视图,适配器和类也会出现此错误.

If I will use transient this keyword to define View or object then this error will fix but this same error comes with another view, adapter, and class.

Logcat

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.android.ui.fragment.CustomViewFragment)
        at android.os.Parcel.writeSerializable(Parcel.java:1850)
        at android.os.Parcel.writeValue(Parcel.java:1797)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:945)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.os.Parcel.writeBundle(Parcel.java:1014)
        at android.content.Intent.writeToParcel(Intent.java:11155)
        at android.app.IActivityTaskManager$Stub$Proxy.startAppLockService(IActivityTaskManager.java:8468)
        at android.app.Activity.startAppLockService(Activity.java:8950)
        at android.app.Activity.performStart(Activity.java:8022)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3512)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7860)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
     Caused by: java.io.NotSerializableException: androidx.appcompat.widget.Toolbar
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
        at android.os.Parcel.writeSerializable(Parcel.java:1845)
        at android.os.Parcel.writeValue(Parcel.java:1797) 
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:945) 
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584) 
        at android.os.Bundle.writeToParcel(Bundle.java:1253) 
        at android.os.Parcel.writeBundle(Parcel.java:1014) 
        at android.content.Intent.writeToParcel(Intent.java:11155) 
        at android.app.IActivityTaskManager$Stub$Proxy.startAppLockService(IActivityTaskManager.java:8468) 
        at android.app.Activity.startAppLockService(Activity.java:8950) 
        at android.app.Activity.performStart(Activity.java:8022) 
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3512) 
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) 
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:237) 
        at android.app.ActivityThread.main(ActivityThread.java:7860) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075) 

Activity.java

   public class BaseFragmentActivity extends AppCompatActivity implements Serializable, View.OnClickListener {
    
        private static final String TAG = "BaseFragmentActivity";
        private Toolbar mToolbar;
        private ImageView tBtnSave, tBtnBack;
        private TextView tTxtTitle;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_base_fragment);
    
            mToolbar = findViewById(R.id.toolbar);
            tBtnSave = findViewById(R.id.toolbar_btn_save);
            tBtnBack = findViewById(R.id.toolbarBtnBack);
            tTxtTitle = findViewById(R.id.toolbar_title);
        }

        ...
}

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.android.app"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
        multiDexEnabled true
    }
    buildTypes {
        debug {
            debuggable true
            buildConfigField "Boolean", "DEBUG_MODE", "true"
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-annotations:28.0.0'
    annotationProcessor 'com.android.support:support-annotations:28.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'

    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    implementation 'com.android.volley:volley:1.1.1'
    implementation 'androidx.palette:palette:1.0.0'

    //External Animation Library
    implementation 'com.airbnb.android:lottie:3.4.1'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

编辑并修复.

public class BaseFragmentActivity extends AppCompatActivity implements Serializable, View.OnClickListener {
    
        // By using `transient` keyword to define view or class to say it's not serialized view or class.

        private static final String TAG = "BaseFragmentActivity";
        private transient Toolbar mToolbar;
        private transient AppCompatImageView tBtnSave, tBtnBack;
        private transient AppCompatTextView tTxtTitle;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_base_fragment);
    
            mToolbar = findViewById(R.id.toolbar);
            tBtnSave = findViewById(R.id.toolbar_btn_save);
            tBtnBack = findViewById(R.id.toolbarBtnBack);
            tTxtTitle = findViewById(R.id.toolbar_title);
        }

        ...
}

推荐答案

看起来像在代码中的某个地方,您正在尝试编写整个Fragment(看起来是CustomViewFragment)以进行包裹:

Looks like somewhere in your code, you are trying to write a whole Fragment (looks like it is CustomViewFragment) to parcel:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.android.ui.fragment.CustomViewFragment)

要可序列化您的类及其所有成员,必须实现Serializable.因为Fragment的上下文是Activity(可能是BaseFragmentActivity的子类),所以它也要经历序列化过程.但是FragmentActivity都没有实现Serializable接口.

To be serializable your class and all its members have to implement Serializable. Because Fragment's context is Activity (that is probably a subclass of BaseFragmentActivity) it also goes through the process of serialization. But neither Fragment nor Activity implements Serializable interface.

这篇关于AndroidX:仅在Android版本10设备中,Parcelable遇到IOException编写可序列化对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆