片段的onPause()中的缓存数据在返回片段时为null

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了片段的onPause()中的缓存数据在返回片段时为null相关的知识,希望对你有一定的参考价值。

我有一个片段,它在布局中包含一个MapView(但它与我要问的问题无关,但请记住它。):

public class MyFragment extends Fragment {

   // I have a variable used to cache data in onPause()
   private MyData mData;

   @BindView(R.id.map)
   MapView mMapView;

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

       // I initiate my data in onCreate()
       mData = new MyData();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       View rootView = inflater.inflate(R.layout.mylayout, container, false);
       if (mMapView != null) {
            // initiate map view
            mMapView.onCreate(savedInstanceState);
            mMapView.getMapAsync(this);
        }
    }

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public void onPause() {
        super.onPause();
        // in onPause() I cache the data I got from another instance
        mData = someInstance.getHoldData();
    }

    /*map view callback! Here, I check the value of mData, when comes back to this fragment, it always get called*/
    @Override
    public void onMapReady(GoogleMap googleMap) {

        // I use data here, when comes back to this fragment, this is always called.
       // PROBLEM: sometimes mData is null, why?
       checkCachedData(mData);
    }
}

所以,这就是我上面的内容:

  1. 我在qazxsw poi回调片段中发起了qazxsw poi,它只召唤一次。
  2. 我在mData中准备了地图视图,当回到这个片段时,它总是被调用。
  3. 我在onPause()中缓存数据

onCreate()onCreateView(...)被称为第一次发射该片段。

问题:当我转到另一个片段然后回到onCreate()时,没有调用MyFragment,这意味着在内存中仍然存在MyFragment的前一个实例。但是,当回到这个片段时,有时MyFragmentonCreate()回调中为空。为什么?我不明白。为什么mData可以为null&onCreate()不被调用?

====我切换到另一个片段:===

onMapReady(GoogleMap googleMap)
答案

我假设当你说你有另一个片段你去的时候,你的意思是你正在导航,例如,使用导航抽屉。当您的片段被另一个片段替换时,第一个片段会暂停。这意味着将调用onPause回调。当片段作为前景片段返回时,它将恢复,因此将调用onResume回调。要解决您的问题,您应该:

  • 缓存onPause中的数据;
  • 在onResume中恢复它。

以上是关于片段的onPause()中的缓存数据在返回片段时为null的主要内容,如果未能解决你的问题,请参考以下文章

Seekbar进度drawable异常行为onPause

如何区分两个“onpause”事件 - 由单击“暂停”按钮引起,以及由到达媒体片段末尾引起?

Android片段生命周期:onResume调用了两次

活动和片段之间的生命周期

如何在 graphQL 片段中定义可选字段以进行查询

Fragment 与 Parcel 一起崩溃:调用 onPause 方法时无法编组值错误