3

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

我创建了一个具有多个选项卡的应用程序。当用户滑入选项卡时,大多数选项卡使用 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() 不会发生任何事情。

如果有人需要我的 onPostExecute() 代码来解决问题,请告诉我。

这一直困扰着我一段时间,我无法自己解决这个问题。有了这个错误,我的应用程序的体验非常糟糕。非常感谢您的帮助!

提前致谢!

4

2 回答 2

9

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

if(task != null && task.getStatus() == Status.RUNNING)
    task.cancel(true);
于 2012-10-30T10:45:33.917 回答
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()方法中执行。希望这会帮助你。

于 2012-10-30T11:13:55.793 回答