CysionLiu / ImagePicker

仿微信的图片选择,支持AndroidX,适配Android Q
Apache License 2.0
321 stars 71 forks source link

加载到自己的demo中,报Parcelable encountered IOException writing serializable object #17

Closed lylelqc closed 5 years ago

lylelqc commented 5 years ago

在gridview中调起拍照,老是报这个错误 -Parcelable encountered IOException writing serializable object,发现是ImageGridActivity这个崩溃了,怎么解决?

日志如下 2019-06-10 14:19:44.151 7037-7037/com.exmaple.app E/AndroidRuntime: FATAL EXCEPTION: main Process: com.xiumei.app, PID: 7037 java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.exmaple.app.ui.match.EnrollInActivity$EnrollImageLoader) at android.os.Parcel.writeSerializable(Parcel.java:1717) at android.os.Parcel.writeValue(Parcel.java:1665) at android.os.Parcel.writeArrayMapInternal(Parcel.java:878) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1588) at android.os.Bundle.writeToParcel(Bundle.java:1233) at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:3954) at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:144) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:201) at android.app.ActivityThread.main(ActivityThread.java:6815) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) Caused by: java.io.NotSerializableException: com.exmaple.app.ui.match.EnrollInActivity 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.writeObject(ObjectOutputStream.java:354) at android.os.Parcel.writeSerializable(Parcel.java:1712) at android.os.Parcel.writeValue(Parcel.java:1665)  at android.os.Parcel.writeArrayMapInternal(Parcel.java:878)  at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1588)  at android.os.Bundle.writeToParcel(Bundle.java:1233)  at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:3954)  at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:144)  at android.os.Handler.handleCallback(Handler.java:873)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:201)  at android.app.ActivityThread.main(ActivityThread.java:6815)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) 

CysionLiu commented 5 years ago

怎么看也是序列化的问题,比如这句Caused by: java.io.NotSerializableException: com.exmaple.app.ui.match.EnrollInActivity,这个类若作为数据类,需要实现Serializable这个接口。这问题跟lib无关

lylelqc commented 5 years ago

怎么看也是序列化的问题,比如这句Caused by: java.io.NotSerializableException: com.exmaple.app.ui.match.EnrollInActivity,这个类若作为数据类,需要实现Serializable这个接口。这问题跟lib无关

activity也不能实现Serializable吧,这只是启动girdactivity的类啊

CysionLiu commented 5 years ago

com.exmaple.app.ui.match.EnrollInActivity这个类不是lib里的 至于怎么启动ImageGridActivity,这个项目里没有特殊的地方,就是: ··· Intent intent = new Intent(WxDemoActivity.this, ImageGridActivity.class); intent.putExtra(ImageGridActivity.EXTRAS_TAKE_PICKERS, true); // 是否是直接打开相机 startActivityForResult(intent, REQUEST_CODE_SELECT); ···

这个WxDemoActivity也没特殊的地方

lylelqc commented 5 years ago

com.exmaple.app.ui.match.EnrollInActivity这个类不是lib里的 至于怎么启动ImageGridActivity,这个项目里没有特殊的地方,就是: ··· Intent intent = new Intent(WxDemoActivity.this, ImageGridActivity.class); intent.putExtra(ImageGridActivity.EXTRAS_TAKE_PICKERS, true); // 是否是直接打开相机 startActivityForResult(intent, REQUEST_CODE_SELECT); ···

这个WxDemoActivity也没特殊的地方

嗯嗯,我确实是这样启动的 /Intent cameraIntent = new Intent(this, ImageGridActivity.class); cameraIntent.putExtra(ImageGridActivity.EXTRAS_TAKE_PICKERS, true); // 是否是直接打开相机 cameraIntent.putExtra(ImageGridActivity.EXTRAS_IMAGES, images); startActivityForResult(cameraIntent, IMAGE_CAMERA);/ 而且有配置Imagepicker,就是在启动拍照模式的时候,ImageGirdActivity报这个异常闪退了

CysionLiu commented 5 years ago

直接拍照是不能传递images的

DuShuYuan commented 5 years ago

错误代码: imagePicker.setImageLoader(new ImageLoader() { @Override public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { 。。。 }

        @Override
        public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) {

。。。 }

        @Override
        public void clearMemoryCache() {

        }
    }); 

解决问题: imagePicker.setImageLoader(new GlideImageLoader());

public class GlideImageLoader implements ImageLoader { @Override public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { 。。。 }

@Override
public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) {
    。。。
}

@Override
public void clearMemoryCache() {

}

}

lylelqc commented 5 years ago

错误代码: imagePicker.setImageLoader(new ImageLoader() { @override public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { 。。。 }

        @Override
        public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) {

。。。 }

        @Override
        public void clearMemoryCache() {

        }
    }); 

解决问题: imagePicker.setImageLoader(new GlideImageLoader());

public class GlideImageLoader implements ImageLoader { @override public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { 。。。 }

@Override
public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) {
    。。。
}

@Override
public void clearMemoryCache() {

}

}

是这样的吗

DuShuYuan commented 5 years ago

嗯 亲测 把GlideImageLoader 单独拎出来一个java文件就没事了

lylelqc commented 5 years ago

嗯 亲测 把GlideImageLoader 单独拎出来一个java文件就没事了

好的,待我回去试试