从活动到片段解析序列化界面对象



我有接口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。

如果您真的需要这样做,请创建一个真正的独立类,而不是匿名的内部类。您可能会有更多运气。

最新更新