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

时间:2018-03-01 14:58:33

标签: android android-fragments

我有一个片段,它在布局中包含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. 我在MyFragment的mData回调中启动onCreate(),只调用一次。

  2. 我准备了onCreateView(...)中的地图视图,该视图在返回此片段时始终会调用。

  3. 我将数据缓存在onPause()

  4. 第一次启动片段时会调用onCreate() 的{p> MyFragment

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

    ====我通过以下方式切换到另一个片段:===

    getTransaction().addToBackStack(myStack).replace(containerId, nextFragment, TAG).commit();
    

1 个答案:

答案 0 :(得分:0)

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

  • 将数据缓存在onPause;
  • 将其恢复为onResume。