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 (refreshlist) は、変更を適用するアプリケーションが残っていないという事実を処理できません。

私がやりたいことは、アクティビティがない場合に強制終了しないアプリケーションを作成することです。

  1. EITHER アクティビティが停止した場合に ASyncTask を停止したい
  2. または、アプリケーションでタスクを実行し続け、強制的に閉じないようにしたい (例: アクティビティが接続されていない場合、onPostExecute() では何も起こりません。

問題を解決するために私の onPostExecute() コードが必要な場合は、お知らせください。

これはしばらくの間私を悩ませてきました、そして私はこれを自分で解決することができませんでした. このバグがあると、私のアプリのエクスペリエンスはかなりひどいものになります。助けていただければ幸いです。

前もって感謝します!

4

2 に答える 2

9

タスクへの参照を保持し、onDestroyおよびonConfigurationChangesメソッドでタスクをキャンセルします。

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 に答える