Сериализуемый ViewPager во фрагменте вызывает сбой приложения Android при открытии приложения из фона - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь передать ViewPage в Fragement в моем приложении. Но приложение вылетает при открытии приложения после того, как оно было убито ОС, или при повторном открытии приложения из фона, когда в настройках разработчика включено «Не сохранять действия».

Вот сводка сообщения об ошибке от Logcat:

(1) java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.test3 / com.test.MainActivity}: java.lang.RuntimeException: Parcelable обнаружил IOException, считывающий объект Serializable (name = com.test.VerticalViewPager)

(2) Причина: java.lang.RuntimeException: Parcelable обнаружил IOException, читающее Serializable объект (name = com.test.VerticalViewPager)

(3) вызвано: java.io.InvalidClassException: com.test.VerticalViewPager; нет действительного конструктора

После некоторого повторного поиска я обнаружил, что класс Java, в котором реализован Serializable, ДОЛЖЕН иметь конструктор без аргументов (ссылка: http://burnignorance.com/java-web-development-tips/java-serialization-and-need-for-a-no-arg-constructor/). Android Studio постоянно предупреждает меня о том, что «в конструкторе android.support.v4.view.ViewPager» нет конструктора по умолчанию », когда я пытаюсь добавить конструктор без аргументов в мой класс ViewPager.

Я провел целый день исследований и до сих пор не знаю, как его решить. Пожалуйста, дайте мне знать, если у вас есть идеи, спасибо


Вот класс Fragment:

public final class FragmentTest extends Fragment {

    private static final String VERTICALVIEWPAGER = "VERTICALVIEWPAGER";

    public static FragmentTest newInstance(VerticalViewPager myVerticalViewPager) {
        FragmentTest f = new FragmentTest();
        Bundle args = new Bundle();
        args.putSerializable(VERTICALVIEWPAGER, myVerticalViewPager);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        context = (MainActivity) getActivity();

        // Error at this line when open the App after it was killed by OS (Or reopen the App from background while "Don't keep activities" is enabled )
        myVerticalViewPager = getArguments() != null ? (VerticalViewPager) (getArguments().getSerializable(VERTICALVIEWPAGER)) : null;
    }

}


Вот класс ViewPager:

public final class VerticalViewPager extends ViewPager implements Serializable{

    public VerticalViewPager(Context context) {
        super(context);
        init();
    }

    public VerticalViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        // The majority of the magic happens here
        setPageTransformer(true, new VerticalPageTransformer());
        // The easiest way to get rid of the overscroll drawing that happens on the left and right
        setOverScrollMode(OVER_SCROLL_NEVER);
    }

    .
    .
    .
}


Вот полное сообщение Logcat:

2019-04-16 11: 40: 27.676 5369-5369 / com.test3 E / AndroidRuntime: FATAL ИСКЛЮЧЕНИЕ: основной процесс: com.test3, PID: 5369 java.lang.RuntimeException: Невозможно начать деятельность ComponentInfo {com.test3 / com.test.MainActivity}: java.lang.RuntimeException: Parcelable встретил чтение IOException Сериализуемый объект (name = com.test.VerticalViewPager) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2812) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2890) на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1611) на android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:171) в android.app.ActivityThread.main (ActivityThread.java:6633) в java.lang.reflect.Method.invoke (родной метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:547) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823) Вызвано: java.lang.RuntimeException: Parcelable обнаружен IOException, читающая Сериализуемый объект (name = com.test.VerticalViewPager) в android.os.Parcel.readSerializable (Parcel.java:3007) в android.os.Parcel.readValue (Parcel.java:2797) в android.os.Parcel.readArrayMapInternal (Parcel.java:3115) в android.os.BaseBundle.initializeFromParcelLocked (BaseBundle.java:273) на android.os.BaseBundle.unparcel (BaseBundle.java:226) на android.os.BaseBundle.getSerializable (BaseBundle.java:1199) в android.os.Bundle.getSerializable (Bundle.java:1033) в com.test.view.FragmentTest.onCreate (FragmentTest.java:79) в android.support.v4.app.Fragment.performCreate (Fragment.java:2339) в android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1377) в android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1740) в android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1809) в android.support.v4.app.FragmentManagerImpl.dispatchStateChange (FragmentManager.java:3217) в android.support.v4.app.FragmentManagerImpl.dispatchCreate (FragmentManager.java:3166) в android.support.v4.app.FragmentController.dispatchCreate (FragmentController.java:181) в android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:319) вandroid.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84) на com.test.MainActivity.onCreate (MainActivity.java:364) на android.app.Activity.performCreate (Activity.java:7084) в android.app.Activity.performCreate (Activity.java:7075) в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2765) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2890) на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1611) на android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:171) в android.app.ActivityThread.main (ActivityThread.java:6633) в java.lang.reflect.Method.invoke (родной метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:547) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823) Вызывается: java.io.InvalidClassException: com.test.VerticalViewPager; нет действительного конструктора в java.io.ObjectStreamClass $ ExceptionInfo.newInvalidClassException (ObjectStreamClass.java:147) в java.io.ObjectStreamClass.checkDeserialize (ObjectStreamClass.java:757) в java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1778) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1354) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:374) на android.os.Parcel.readSerializable (Parcel.java:3005) на android.os.Parcel.readValue (Parcel.java:2797) в android.os.Parcel.readArrayMapInternal (Parcel.java:3115) в android.os.BaseBundle.initializeFromParcelLocked (BaseBundle.java:273) на android.os.BaseBundle.unparcel (BaseBundle.java:226) на android.os.BaseBundle.getSerializable (BaseBundle.java:1199) в android.os.Bundle.getSerializable (Bundle.java:1033) в com.test.view.FragmentTest.onCreate (FragmentTest.java:79) в android.support.v4.app.Fragment.performCreate (Fragment.java:2339) в android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1377) в android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1740) в android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1809) в android.support.v4.app.FragmentManagerImpl.dispatchStateChange (FragmentManager.java:3217) в android.support.v4.app.FragmentManagerImpl.dispatchCreate (FragmentManager.java:3166) в android.support.v4.app.FragmentController.dispatchCreate (FragmentController.java:181) в android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:319) в android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84) на com.test.MainActivity.onCreate (MainActivity.java:364) на android.app.Activity.performCreate (Activity.java:7084) в android.app.Activity.performCreate (Activity.java:7075) в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2765) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2890) на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1611) на android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:171) в android.app.ActivityThread.main (ActivityThread.java:6633) в java.lang.reflect.Method.invoke (родной метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:547) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)

...