我正在使用http执行一些异步任务来获取一些数据。
当我在异步操作中关闭应用程序时,出现NullPointerException错误。这似乎正在发生,因为正在竞争异步任务并调用onTaskCompleted;但该应用程序已经关闭。
有谁知道如何处理这个问题?
我正在使用Android Studio,Android版本4.4.2运行。 Galaxy S4。
java.lang.NullPointerException
at com.example.lu.seed_2.Tabs.Tab4$3.onTaskCompleted(Tab4.java:174)
at com.example.lu.seed_2.ArticleAsync.onPostExecute(ArticleAsync.java:36)
at com.example.lu.seed_2.ArticleAsync.onPostExecute(ArticleAsync.java:11)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
根据要求,这是onTaskComplete代码
articles = convertJsonToArticles(httpResult.getBody());
articleAdapter = new ArticleAdapter(getActivity().getApplicationContext(), articles); //<-- APP CRASHES HERE
listView = (ListView) getActivity().findViewById(R.id.mobile_list4);
listView.setAdapter(articleAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(getActivity().getApplication(), WebViewActivity.class);
intent.putExtra("_id", articles.get(i).getId());
startActivity(intent);
}
});
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int itemsLeftCount = totalItemCount - firstVisibleItem;
if (itemsLeftCount > 8) {
return;
}
if (isLoadingMore == true) {
return;
}
loadMoreArticles();
}
});
listView.addFooterView(footerView);
showNotLoading();
v.refreshComplete();
答案 0 :(得分:2)
也许你应该取消onStop()
中的所有任务,并检查它是否在doInBackground()
中被取消,如果它在一个循环中。还要检查空引用。
答案 1 :(得分:1)
在Additon中@ProtossShuttle回答:
正如@NguyễnHoàiNam的评论所提到的,如果你在gui被摧毁后访问gui元素,你会得到一个NPE。
我遇到了同样的问题并且像这样解决了它
public class DirectoryLoaderTask extends AsyncTask<QueryParameter, Integer, IDirectory> {
protected IDirectory doInBackground(QueryParameter... queryParameter) {
// do heavy processing
if (isCancelled()) return null;
// do heavy processing
if (isCancelled()) return null;
// do heavy processing
if (isCancelled()) return null;
// neither error nor canceld yet go on in gui
return processingresult
}
protected void onPostExecute(IDirectory result) {
if (!isCancelled() && (result != null)) {
updateGui(result);
}
}
}
在访问gui元素之前,我会检查onPostExecute
的开头是否没有取消。