Android: уничтожение активности и отображение потока AlertDialog - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть действие, которое запускает один поток, который отображает один AlertDialog.Проблема в том, что если действие уничтожено до того, как этот поток отобразит alertDialog, возникнет ошибка приложения (в журнал, который я прочитал: Вы уверены, что действие выполняется?).Я могу решить эту проблему?

РЕДАКТИРОВАТЬ: это ядро ​​темы

@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);
    }

Ответы [ 2 ]

1 голос
/ 15 мая 2012

Поток должен проверить, является ли вызывающая активность активной.

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
  }
}

Также обратите внимание, что вы вносите потенциальную утечку памяти, позволяя потоку удерживать обработчик действия.Я бы посоветовал вам хранить WeakReference на обработчике в потоке, а не на обработчике напрямую.

0 голосов
/ 01 апреля 2012

Просто в вашем методе уничтожения проверьте, отображался ли поток в диалоговом окне с предупреждением.

Если поток не выполнил свою задачу, это означает, что поток работает, и затем вы можете вручную остановить поток.

, так что если поток выполняется, то он будет остановлен / отменен перед уничтожением действия.

...