0

私のアプリケーションでは、Activity の起動時に AsyncTask を使用して、特定の連絡先の着信音を取得します。

正常に動作しますが、AsyncTask が doInBackground メソッドに到達する前にアプリケーションが 2 回停止された場合、Activity が再び開始されたときに AsyncTask が正しく実行されず、onPreExecute() メソッドに到達するだけであることに気付きました。

これが私のコードです:

AsyncTask 自体:


private class SelectRingtoneTask extends AsyncTask<String, Void, Void> {

          // can use UI thread here   
          protected void onPreExecute() {
              Log.d("cda", "Into selectRingToneTask - onPreExecute() - " + selectRingtoneFinished);
          }

          // automatically done on worker thread (separate from UI thread)
          protected Void doInBackground(final String... args) {
              Log.d("cda", "Into selectRingToneTask - !!!!!!!!!!!!!!!");
             getRingTone();
             return null;
          }

          // can use UI thread here
          protected void onPostExecute(final Void unused) {
           selectRingtoneFinished = true;
           Log.d("cda", "Into selectRingToneTask - onPostExecute - " + selectRingtoneFinished);
          }
       }

起動時に AsyncTask を呼び出す場所:


if(srtt == null){
srtt = new SelectRingtoneTask();
Log.d("cda", "RingTone - " + srtt.getStatus());
}
srtt.execute();

AsyncTask が終了する前にアクティビティを開始してアクティビティを閉じると問題が発生します。これが 1 回発生した場合は問題ないように見えますが、2 回目に発生した後、AsyncTask は onPreExecute() メソッドに到達するだけで完了しません。アプリケーションが強制停止されて再起動されるまで、もう一度。

なぜこれが起こるのか誰にも分かりませんか?

4

2 に答える 2

2

アクティビティが破棄されたときに AsyncTaskが必要cancelであり、AsyncTask のメソッドisCancelledでは、フェッチされた結果を操作する前にフラグをチェックします。

Shelfのソース コードを読んで、構成の変更後もタスクを保持する方法と、アクティビティが破棄されたときにタスクを適切にキャンセルする方法を確認することを強くお勧めします。

于 2010-09-10T09:20:56.870 に答える
0
    if(srtt == null){    <--- Not needed
        srtt = new SelectRingtoneTask();
        Log.d("cda", "RingTone - " + srtt.getStatus());
    }
    srtt.execute();

近くで何を意味するのかわかりませんが、スレッドにも同様の問題がありました。私の意見では、ここでの問題は、実行が許可されていないときに、同じアクティブタスクを 2 回起動することです。アクティビティを閉じるときに問題を解決するには、スレッドをキャンセルし、srtt を null に設定してください。お役に立てれば

于 2011-05-27T15:21:00.520 に答える