Android:应用程序关闭后应用程序在onTaskCompleted崩溃

时间:2015-08-05 11:06:29

标签: java android asynchronous

我正在使用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();

2 个答案:

答案 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的开头是否没有取消。