разбор сериализованного объекта интерфейса от действия к фрагменту - PullRequest
0 голосов
/ 04 марта 2019

У меня есть интерфейс Callback класс, как показано ниже,

public interface Callback extends Serializable {
     void onResponse(int responseCode);
}

Я использую вышеупомянутый интерфейс для синтаксического анализа в качестве объекта обратного вызова params, как показано ниже

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);

Все функции работают нормально, но когда яПриостановив приложение, сгенерирует исключение RuntimeException, исключение будет показано ниже:

 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) 

Насколько я знаю, когда я приостанавливаю приложение, приложение пытается сохранить текущее состояние приложения, сохраняя при этомсостояние, не удалось идентифицировать сериализованный обратный вызов для сохранения в текущем состоянии.Что я должен сделать, чтобы обработать это исключение?

UPDATE : Когда мы рассматриваем жизненный цикл фрагмента, когда запускается состояние onPause, текущее состояние сохраняется в стеке, затеммой объект сериализации снова будет добавлен в связку к main thread.Это ошибка времени происходит, как я проанализировал

Заранее спасибо за ваше драгоценное время!

1 Ответ

0 голосов
/ 05 марта 2019

Чтобы ответить на ваш вопрос, «реальная проблема» заключается в том, что вы пытаетесь сериализовать экземпляр класса, а не интерфейс.Ваш класс является анонимным внутренним классом с именем 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;
        }
      }
    }
};

Невозможно сериализовать этот анонимный внутренний класс.См. NotSerializableException для анонимного класса для получения более подробной информации.

Если вам действительно нужно это сделать, создайте настоящий автономный класс вместо анонимного внутреннего класса.Возможно, вам повезет больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...