在片段中使用加载器会导致NullPointerException

时间:2017-08-23 20:05:27

标签: android android-fragments android-loader

我在android.support.v4.content.Loader中使用android.support.v4.app.Fragment,有时我会得到

  

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.support.v4.content.Loader.abandon()'

这是我第一次使用装载机而且我不能100%确定它们是如何工作的。 我也希望加载器每分钟刷新一次数据,所以我每分钟都使用一个处理程序并且可以运行来调用loaderManager.restartLoader()。 (如果这不是你应该做的,我愿意接受更好的想法)

到目前为止,我将Runnable作为全局变量:

private Runnable mStatusChecker = new Runnable() {
    @Override
    public void run() {
            refresh();
    }
};

调用refresh()函数:

public void refresh() {
    if (MainActivity.isConnected) {
        loaderManager.restartLoader(LOADER_ID, null, this);
    }
}

这行代码,loaderManager.restartLoader,有时会引发异常(虽然有时会起作用)。

OnCreateView中,我初始化加载器和处理程序

   View rootView = inflater.inflate(R.layout.layout_for_fragments, container, false);


    loaderManager = getLoaderManager();

    if (MainActivity.isConnected) {
        loaderManager.initLoader(LOADER_ID, null, this);
    }

    adapter = new CustomArrayAdapter(getActivity().getApplicationContext(), exchanges, R.color.colorPrimaryDark);

    listView = rootView.findViewById(R.id.list);


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Exchange exchange = exchanges.get(i);
            String url = exchange.getUrl();
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(browserIntent);

        }
    });

    listView.setAdapter(adapter);


    mHandler = new Handler();
    mHandler.postDelayed(mStatusChecker, refreshRate);


    setHasOptionsMenu(true);


    return rootView;

并且onCreateLoader方法是

public Loader onCreateLoader(int i, Bundle bundle) {

    String[] strings = {QUADRIGA_BTC};

    if (isAdded()){
        return new BLoader(getActivity(), strings);
    }
    return null;
}

我有4个非常相似的片段,它们都有一个类似的加载器,片段由tablayout和viewpager管理。

1 个答案:

答案 0 :(得分:1)

我想我发现了这个问题。从Runnable中的onStop()删除回调似乎已修复它。我的变化:

@Override
public void onStop() {
    super.onStop();
    mHandler.removeCallbacks(mStatusChecker);
}