我有接口Callback
类,如下所示,
public interface Callback extends Serializable {
void onResponse(int responseCode);
}
我使用上述接口作为参数回调对象解析,如下
private Callback callback = new Callback() {
@Override
public void onResponse(int responseCode) {
switch (responseCode) {
case ResponseCode.FACE_NOT_DETECT: {
notifyText.setText("Face not detected");
break;
}
case ResponseCode.FACE_TOO_FAR: {
notifyText.setText("Face too far, Please get closer to the camera");
break;
}
case ResponseCode.FACE_BLINK_TO_CAPTURE: {
notifyText.setText("Blink once to capture your face image");
break;
}
}
}
};
然后,我使用上述callback
对象发送到我的库
FaceDetectFragment.newInstance(callback, mode);
在此 FaceDetectFragment
类中,我按照下面操纵参数,
public static FaceDetectFragment newInstance(Callback callback, int mode) {
if (faceInstance != null) {
return faceInstance;
}
faceInstance = new FaceDetectFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(KEY_USER_CALLBACK, callback);
bundle.putInt(KEY_BIOMETRIC_MODE, mode);
faceInstance.setArguments(bundle);
return faceInstance;
}
然后,我在onCreate
方法中使用上面设置的参数,如下所示,
if (getArguments() != null) {
clientCallback = (Callback) getArguments().getSerializable(KEY_USER_CALLBACK);
biometricMode = getArguments().getInt(KEY_BIOMETRIC_MODE);
}
然后,在此处,我将在下面使用回调对象,
clientCallback.onResponse(ResponseCode.FACE_NOT_DETECT);
所有功能插曲都可以正常工作,但是当我暂停应用程序时,会抛出Runtime Exception,例外如下所示,
Process: com.ej.face_demo_android, PID: 29679
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.ej.face_demo_android.FaceDetectActivity$2)
at android.os.Parcel.writeSerializable(Parcel.java:1536)
at android.os.Parcel.writeValue(Parcel.java:1484)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:733)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
at android.os.Bundle.writeToParcel(Bundle.java:1133)
at android.os.Parcel.writeBundle(Parcel.java:773)
at android.support.v4.app.FragmentState.writeToParcel(FragmentState.java:124)
at android.os.Parcel.writeTypedArray(Parcel.java:1316)
at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:639)
at android.os.Parcel.writeParcelable(Parcel.java:1505)
at android.os.Parcel.writeValue(Parcel.java:1411)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:733)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
at android.os.Bundle.writeToParcel(Bundle.java:1133)
at android.os.Parcel.writeBundle(Parcel.java:773)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:4146)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4148)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Caused by: java.io.NotSerializableException: com.ej.face_demo_android.FaceDetectActivity
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at android.os.Parcel.writeSerializable(Parcel.java:1531)
at android.os.Parcel.writeValue(Parcel.java:1484)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:733)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
at android.os.Bundle.writeToParcel(Bundle.java:1133)
at android.os.Parcel.writeBundle(Parcel.java:773)
at android.support.v4.app.FragmentState.writeToParcel(FragmentState.java:124)
at android.os.Parcel.writeTypedArray(Parcel.java:1316)
at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:639)
at android.os.Parcel.writeParcelable(Parcel.java:1505)
at android.os.Parcel.writeValue(Parcel.java:1411)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:733)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
at android.os.Bundle.writeToParcel(Bundle.java:1133)
at android.os.Parcel.writeBundle(Parcel.java:773)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:4146)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4148)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
作为我暂停应用程序时的知识,该应用程序试图保存应用程序的当前状态,而保存状态时,无法识别序列化调用以在当前状态下保存。我应该怎么做这个例外?
更新:当我们考虑片段生命周期时,当onPause
状态触发时,当前状态WI保存在堆栈中时,我的序列化对象将通过main thread
再次包裹在束中。这是我分析
事先感谢您的宝贵时间!
要回答您的问题,"真正的问题"是您试图序列化类的实例,而不是界面。您的课程是您在此创建的匿名内部类,称为com.ej.face_demo_android.FaceDetectActivity$2
:
private Callback callback = new Callback() {
@Override
public void onResponse(int responseCode) {
switch (responseCode) {
case ResponseCode.FACE_NOT_DETECT: {
notifyText.setText("Face not detected");
break;
}
case ResponseCode.FACE_TOO_FAR: {
notifyText.setText("Face too far, Please get closer to the camera");
break;
}
case ResponseCode.FACE_BLINK_TO_CAPTURE: {
notifyText.setText("Blink once to capture your face image");
break;
}
}
}
};
不可能序列化此匿名内部类。有关更多血腥的详细信息,请参见匿名类上的notserializable Exception。
如果您真的需要这样做,请创建一个真正的独立类,而不是匿名的内部类。您可能会有更多运气。