【发布时间】:2017-08-23 20:05:27
【问题描述】:
我在android.support.v4.app.Fragment 中使用android.support.v4.content.Loader,有时我得到一个
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 管理。
【问题讨论】:
-
不要从
onCreateLoader()返回null。 -
我尝试将 onCreateLoader() 更改为
public Loader onCreateLoader(int i, Bundle bundle) { String[] strings = {QUADRIGA_BTC}; return new BLoader(getActivity(), strings); }但这会使事情变得更糟并抛出 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context .getApplicationContext()' 在空对象引用上 -
你停止在某处发布
Runnable了吗?实际上,您确定首先需要这样做吗?你的约会对象来自哪里?MainActivity.isConnected字段是怎么回事?
标签: android android-fragments android-loader