保持对象 onPause()

我在使用 Android Fragments 时遇到了很多麻烦,我不知道为什么。


每当我暂停应用程序(onPause())时,我都想在内存中保留一个对象。


我有一个带有一些图层的 MapView。而且我想保留这些图层,这样每当我暂停和恢复应用程序时,地图就不必从头开始重新加载和重新创建它们。


问题是,我无法使用 onSaveInstanceState() 保存它们。它们是对象,而不是基元。它们也来自一个库,所以我不能让它们实现 Serializable 或 Parcelable。


我想在不诉诸于以下的情况下找到解决方案:


android:configChanges="orientation|screenSize">

到我的活动,因为它被认为是不好的做法。此外,它不适用于暂停和恢复应用程序时。


我也试过


this.setRetainInstance(true); // retain this fragment

在我的片段的 onCreate() 上,但我也想避免它。无论如何都行不通。


经过多次试验、错误和测试,我发现我的片段的 onSaveInstanceState() 甚至没有运行。每当我暂停和恢复应用程序时,我什至无法保留一个简单的布尔值。


我读:


使用 Save Instance State 保存 Android Activity 状态


https://developer.android.com/training/basics/activity-lifecycle/recreating


savedInstanceState 始终为 null


Amog 许多其他帖子,当然还有 Android 文档。


我的一些代码:


创建片段:


    navFragment = FragNavigation.newInstance(); // keeping the reference to the navFragment


    // setting up the viewpager

    ViewPager viewPager = findViewById(R.id.vpMainViewPager);

    MainPagerAdapter mainAdapter = new MainPagerAdapter(getSupportFragmentManager(), this);

    mainAdapter.addFragment(navFragment);

    viewPager.setAdapter(mainAdapter);

试图在实例状态中保存一个简单的布尔值(记住:这甚至不会运行):


@Override

public void onSaveInstanceState(@NonNull Bundle outState) {

    super.onSaveInstanceState(outState);


    Log.e(TAG, "onSaveInstanceState: is map loaded? " + mapIsLoaded );


    outState.putBoolean("mapIsLoaded", mapIsLoaded);

}

并尝试加载它:


@Override

public void onCreate(@Nullable Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    this.setRetainInstance(true); // retain this fragment


    Log.e(TAG, "onCreate: null? " + (savedInstanceState == null) );


    if (savedInstanceState != null)

        mapIsLoaded = savedInstanceState.getBoolean("mapIsLoaded", false);

}

我错过了什么?我显然不明白什么。为什么暂停应用程序时很难保持值?


aluckdog
浏览 230回答 2
2回答

千巷猫影

我建议根据架构组件使用ViewModel存储 MapView 层。如果这不是一个选项,您可以使用活动getLastNonConfigurationInstance手动存储和检索对象。

慕标5832272

 @Override    public void onPause() {        /**         * store your data          */        super.onPause();    }    @Override    public void onResume() {        /**         * retrieve your data                */        super.onResume();    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python