为什么我的装载机被毁坏?

时间:2012-07-23 18:49:55

标签: android android-fragments android-loader

我有一个使用Loader的Fragment。 Fragment实现了LoaderManager.LoaderCallbacks。在片段的onCreate()中,我执行setRetainInstance(true),以便在方向更改等配置更改中不会破坏片段。这可以按预期工作,并且不会调用片段的onDestroy()。但是,当我旋转设备时,我的装载机被破坏了。每次旋转设备时,都会创建一个新的Loader。我检查了内存转储并验证了这一点。

  1. 为什么会这样?
  2. 我该如何避免这种情况?
  3. 编辑:为避免混淆:本地变量加载器与此无关。只是检查我以前创建的加载器是否存在。即使使用下面的更新代码(删除了局部变量),也会破坏加载器。

    以下是一些相关代码:

        public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Object> {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true); //Don't destroy fragment across orientation change
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            Log.d(TAG, "onActivityCreated, myTid : " + android.os.Process.myTid());
    
            mLoaderManager = getLoaderManager();
            mLoaderManager.initLoader(MY_LOADER, null, this);
        }
    
        @Override
        public Loader<Object> onCreateLoader(int i, Bundle bundle) {
            Log.d(TAG, "onCreateLoader, myTid : " + android.os.Process.myTid());
            return new MyLoader(getActivity().getApplicationContext());
        }
    
       @Override
        public void onLoaderReset(Loader<Object> objectLoader) {
            Log.d(TAG, "onLoaderReset, myTid : " + android.os.Process.myTid());
    
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (mTxtSomeTxt != null) {
                        mTxtSomeTxt.setText("");
                    }
                }
            });
        }
    
        }
    

1 个答案:

答案 0 :(得分:1)

晚会有点迟了......

对于保留的片段,您需要保存从initLoader(...)返回的加载器,然后在发生配置更改时返回原始加载器。

private Loader<Object> myLoader;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Log.d(TAG, "onActivityCreated, myTid : " + android.os.Process.myTid());

    mLoaderManager = getLoaderManager();
    myLoader = mLoaderManager.initLoader(MY_LOADER, null, this);
}

@Override
public Loader<Object> onCreateLoader(int i, Bundle bundle) {
    Log.d(TAG, "onCreateLoader, myTid : " + android.os.Process.myTid());

    // Handle loader creation on retrained fragments
    if (myLoader != null)  {
        return myLoader;
    }

    return new MyLoader(getActivity().getApplicationContext());
}