我在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管理。
答案 0 :(得分:1)
我想我发现了这个问题。从Runnable
中的onStop()
删除回调似乎已修复它。我的变化:
@Override
public void onStop() {
super.onStop();
mHandler.removeCallbacks(mStatusChecker);
}