2012-04-01 15 views
0

1つのスレッドを起動して1つのAlertDialogを表示するアクティビティがあります。問題は、そのスレッドがalertDialogを表示する前にアクティビティが破棄された場合、アプリケーションエラーが発生していることです(ログにはアクティビティが実行されていますか?)。私はこの問題を解決できますか?Android:アクティビティは、AlertDialogを破棄してスレッドを表示します。

EDIT:スレッドが警告ダイアログを表示したりしていなかったされている場合、これはちょうどあなたのdestroyメソッドのチェックにスレッド

@Override 
    public void run() { 
     String read = ""; 
     try { 
      read = useHttpPost(url); 
      parseFeeds(read); 
      Log.d("TVD MORE_NEWS0", "Feeds ottenuti dalla stringa JSON"); 
      message.obj = feeds; // come object inseriamo i feeds scaricati 
      message.arg1 = 1;// come arg1 mettiamo 1, per indicare che l'operazione ha avuto successo. 
     } catch (NoHttpResponseException e) { 
          //Visual ALertDialog 
      message.obj = null; 
      message.arg1 = -1; 
     } catch (JSONException e) { 
      if(e.getMessage().contains("no_comm")){ 
            //Visual ALertDialog 
       message.obj = null; 
       message.arg1 = -2; 
      } 
      Log.e("TVD MORE_NEWS1", "Errore durante il parsing JSON:" + e.getLocalizedMessage()); 
     } 
     handler.sendMessage(message); 
    } 
+0

何がuseHttpPost()ですか。これはAsyncTaskか他のものですか? – Ishu

+0

いいえss AsyncTask – MimmoG

答えて

0

の中核です。

スレッドがタスクを完了していない場合は、スレッドが実行されていることを意味し、手動でスレッドを停止できます。

スレッドが実行中の場合、アクティビティを破棄する前にスレッドが停止/キャンセルされるようにします。

+0

しかし、thread.stopを呼び出すか、スレッドを無効にしても、スレッドは処理を終了しません.... – MimmoG

+0

小さなコードスニペットが可能です – Ishu

+0

はい、コードを挿入しました私の最初の答えにスレッドの。 – MimmoG

1

呼び出し元アクティビティが有効かどうかを確認する必要があります。

public class CallingActivity{ 
    Thread t; 

    method(){ 
    .. 
    t = new Thread(); 
    t.execute(); 
    } 

    onDestroy(){ 
    t.interrupt(); 
    } 
} 

class Thread{ 
    WeakReference<Handler> handlerRef; 

    run(){ 
    //do my work 
    if(!isInterrupted()){ 
     handlerRef().get().performAction(); 
    else 
     //do nothing 
    } 
} 

スレッドがアクティビティのハンドラを保持できるようにすることで、メモリリークの可能性があります。 Handlerの代わりにThreadのHandlerへのWeakReferenceを直接保持することをお勧めします。

関連する問題