当我的活动发生变化或破坏时,如何阻止ASyncTask崩溃?

时间:2012-10-30 10:43:05

标签: android android-asynctask screen-rotation android-anr-dialog

这可能是另一个问题的重复,我不确定。我读过类似的问题,但要么无法理解它,要么无法成功应用给定的解决方案。

我创建了一个包含多个标签的应用程序。大多数选项卡使用ASyncTask在用户滑入选项卡时更新数据。但是,当AST仍然在运行时有关活动的某些内容发生变化(这种情况发生很多;例如,当用户旋转屏幕或使用后退按钮退出时),应用程序将强制关闭(ANR)。

以下是我在LogCat中看到的情况:

10-30 11:30:01.422: E/AndroidRuntime(4687): FATAL EXCEPTION: main
10-30 11:30:01.422: E/AndroidRuntime(4687): java.lang.NullPointerException
10-30 11:30:01.422: E/AndroidRuntime(4687):     at com.appconstructor.khcreates.Core$refreshList.onPostExecute(Core.java:913)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at com.appconstructor.khcreates.Core$refreshList.onPostExecute(Core.java:1)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at android.os.AsyncTask.finish(AsyncTask.java:631)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at android.os.Looper.loop(Looper.java:137)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at android.app.ActivityThread.main(ActivityThread.java:4745)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at java.lang.reflect.Method.invokeNative(Native Method)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at java.lang.reflect.Method.invoke(Method.java:511)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-30 11:30:01.422: E/AndroidRuntime(4687):     at dalvik.system.NativeStart.main(Native Method)

从我所看到的情况来看,ASyncTask(刷新列表)无法处理没有应用程序可以应用更改的事实。

我想要做的是制作一个如果没有活动就不会强制关闭的应用程序。

  1. 如果活动停止,我希望ASyncTask停止
  2. 或者我希望应用程序只是保持任务运行,但不要强制关闭(例如:如果没有连接任何活动,onPostExecute()没有任何反应。
  3. 如果有人需要我的onPostExecute()代码来解决问题,请告诉我。

    这已经困扰了我一段时间,我无法为自己解决这个问题。我的应用程序的经验是非常可怕的这个错误到位。非常感谢帮助!

    提前致谢!

2 个答案:

答案 0 :(得分:9)

保留对您的任务的引用,并在onDestroyonConfigurationChanges方法中取消任务..

if(task != null && task.getStatus() == Status.RUNNING)
    task.cancel(true);

答案 1 :(得分:4)

最好使用与cancel(true)命令相同的实例执行execute()

AsyncTask<Void,Void,Void> task = new MyAsyncTask();
task.execute();

.....

task.cancel(true);

编辑:您需要在每个片段中存储AsyncTask个体的实例,因此在片段变量时保存new freshList(this,getActivity(),mNum)的实例,并且由于这是片段,因此执行cancel(true)片段的onPause()方法。希望这会对你有所帮助。