通过LoaderManager销毁加载器有时会抛出异常?

时间:2012-06-05 12:52:33

标签: android

我需要销毁一个加载器,有时我会得到以下异常:

java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:960)
at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:768)
at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1104)
at android.support.v4.app.LoaderManagerImpl.destroyLoader(LoaderManager.java:672)
at com.me.test.MyTest.test(MyTest.java:213)

我正在做以下事情:

LoaderManager lm = ...;
Loader loader = ...;
lm.destroyLoader(loader.getId());

这是否意味着装载机可能已经不知何故已经消失了?其他人都看到了吗?

由于

3 个答案:

答案 0 :(得分:1)

Mayeb加载器持有对超出范围的Context的引用:当你改变活动或加载器时会发生这种情况吗?

答案 1 :(得分:0)

对我来说没问题,要么他们更新了库,要么就是它应该调用的顺序:

@Override
public void onDestroy() {
    getActivity().getSupportLoaderManager().destroyLoader(0);
    super.onDestroy();
}

答案 2 :(得分:0)

你得到了NPE,因为你没有意识到如果加载器不再存在,loaderManager.getLoader(id)可以返回null。

Android Developer docs说:

  

public abstract Loader<D> getLoader (int id)

     

返回具有给定id的Loader,如果没有找到匹配的Loader,则返回null。

所以你需要的是添加一个null检查,如:

LoaderManager lm = ...;
Loader loader = ...;
if (loader != null) {    //this will fix you NPE
    lm.destroyLoader(loader.getId());
}

或者你可以避免所有的麻烦,并按照代码行破坏加载器:

lm.destroyLoader(LOADER_ID);