2012-06-25 4 views
15

UIを怠惰にダウンロードして更新するために、私のアプリケーションにAsyncTasksを使用しました。今のAndroid AsyncTasksアクティビティがまだ実行されているかどうかを確認する

は私AsyncTasksは本当単にUIを更新します。

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

私の問題は、性別TextViewからレンダリングされた活動は、まだ使用可能であるかどうかを確認する方法ですか?

もしそうでなければ、エラーが発生し、アプリケーションがシャットダウンします。

+0

は確かに試すことができないではないかもし(ヌル==性別&& gender.isShownは()) –

答えて

25

あなたは、アクティビティのonDestroy

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

、あなたはあなたのasynctaskが

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

ニース。しかし、オンデストロイが毎回呼び出されるような保証はありません。 (下記の参考リンク用)。あなたはそれにどうやって対処していますか? https://stackoverflow.com/a/4449988/3265444 – Ajji

0

ない

if (gender) { 
    gender.setText(values[0]); 
} 

は十分なはず?

+0

は、あなたが(ヌル==性別)のために取っていますか?それでも、それだけでは時間が足りません。 –

+1

いいえ、それでは不十分です。アクティビティは終了する可能性がありますが、性別はまだnullではない可能性があります。ビュー/ウィンドウがアクティブでなくなったため、参照を試みると失敗します。 – AgileYogi

1

私はこのシナリオに直面したことはありません。私はあなたの質問に答えようとします。

AsyncTaskに渡されたContextを検証する必要があります。あなたが検証

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

を行うことができます

利点は活動がこの文に達する時間によって破壊された場合、あなたのContextが自動的にnullになり、あなたがシナリオを扱うことができる、となります。

+2

これは動作しません。あなたがその活動に固執しているので、それはゼロにされません。無効になりますが、非同期タスクは引き続きアクティビティを参照し続けます。 – uthark

1

をキャンセル(アクティビティが破壊)されたかどうかをチェックし、変更を実行するとき、私はあなたのことを主張するだろうに、あなたasynctaskをキャンセルすることができますアクティビティが実行されていない場合、なぜAsyncTaskをキャンセルしないのですか? それはより良い実現可能な解決策になります。アプリケーションが実行中であれば、あるアクティビティから別のアクティビティに移動するとAFAIKエラーは発生しません。その後、you'r活動が実行されていない、あなたはAsyncTaskを確認することができ、私はAsyncTaskをキャンセルする主張でしょう

しかしが、実行中またはされていない、

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

を試してみて、私は類似していました問題 - 本質的に私は、ユーザーがフラグメントを破壊した後、非同期タスクでNPEを取得していました。スタックオーバーフロー上の問題を調査した後、私は以下のソリューション採用:次に

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

を、私は私の非同期コードで定期的に「実行している場合」にチェックを入れてください。私はこれをストレステストして、私は今私の活動を "壊す"ことができません。これは完全に機能し、私がSOで見た解決策のいくつかよりも簡単であるという利点があります。

+0

よろしくお願い致します。私はついにそれを手に入れました!!! – sshashank124

+1

これはシンプルであり、実際には意味があります:)誰かが 'volatile'キーワードについて考えているなら、これを読んでください:http://stackoverflow.com/a/107040/4331787 –

1

Androidの開発者が示唆上の1回のトレーニングのthis一環として、タスクが実行され、参照がそれを使用する前にnullをあるかどうかを確認された後に更新する必要があるUI要素にWeakReferenceを続けます。これは、UIがまだ周囲にあるかどうかをチェックするだけでなく、UI要素がガベージコレクションされるのを防ぐこともできません。

1

チェックアクティビティが実行されているか

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
関連する問題