我有一个使用Loader的Fragment。 Fragment实现了LoaderManager.LoaderCallbacks。在片段的onCreate()
中,我执行setRetainInstance(true)
,以便在方向更改等配置更改中不会破坏片段。这可以按预期工作,并且不会调用片段的onDestroy()
。但是,当我旋转设备时,我的装载机被破坏了。每次旋转设备时,都会创建一个新的Loader。我检查了内存转储并验证了这一点。
编辑:为避免混淆:本地变量加载器与此无关。只是检查我以前创建的加载器是否存在。即使使用下面的更新代码(删除了局部变量),也会破坏加载器。
以下是一些相关代码:
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("");
}
}
});
}
}
答案 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());
}