gpt4 book ai didi

android - 为什么我的加载器被破坏了?

转载 作者:行者123 更新时间:2023-11-29 02:02:57 25 4
gpt4 key购买 nike

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

  1. 为什么会这样
  2. 我怎样才能避免这种情况?

编辑:为避免混淆:局部变量加载器与此处无关。它只是为了检查我之前创建的加载器是否存在。即使使用下面的更新代码(删除局部变量),加载程序也会被销毁。

这里是一些相关的代码:

    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("");
}
}
});
}

}

最佳答案

派对有点晚了......

对于保留的 fragment ,您需要保存从 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());
}

关于android - 为什么我的加载器被破坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11618576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com