这可能是另一个问题的重复,我不确定。我也读过类似的问题,但要么无法理解,要么无法成功应用给定的解决方案。
我创建了一个具有多个选项卡的应用程序。大多数选项卡在用户滑入选项卡时使用异步任务更新数据。但是,当AST仍在运行时活动的某些内容发生更改(这种情况经常发生;例如当用户旋转屏幕或使用后退按钮退出时),应用程序将强制关闭(ANR)。
以下是我在我的日志中看到的情况:

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(refreshlist)无法处理这样一个事实,即没有应用程序可以应用更改。
我想做的是制作一个应用程序,如果没有活动,它不会强制关闭。
如果活动停止,我希望asynctask停止
或者我希望应用程序只是保持任务运行,而不是强制关闭(例如:如果没有连接活动,postExecute()上不会发生任何事情)。
如果有人需要我的onPostExecute()代码来解决问题,请告诉我。
这件事困扰了我一段时间,我自己也没办法解决。我的应用程序在安装了这个错误后的体验非常糟糕。非常感谢您的帮助!
提前谢谢!

最佳答案

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

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

.....

task.cancel(true);

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

10-07 19:08
查看更多