Android отменить тему - PullRequest
       5

Android отменить тему

1 голос
/ 30 января 2011

Я выполняю простую асинхронную операцию с Android, но поскольку я хочу выполнить действие пару раз, я не использую AsyncTask, вместо этого я использую механизм Thread / Runnable с Handler для обработки сообщений и персонала.Но в один момент, когда мне нужно выполнить вторую операцию, мне нужно отменить предыдущую операцию, если она все еще активна.

У меня есть что-то вроде этого:

private void exec() {
    new Thread(new Runnable() {
    public void run() {
    mBind.exec(3);
    }
  }).start();
}

Затем в exec(int a) У меня есть целое число, например:

for(int i = 0; i<=res.lenght; i++) {
   updateGui();
}

Но в какой-то момент метод exec () вызывается во второй раз, и графический интерфейс обновляется с предыдущими результатами тоже (мне нужны только результатыиз нового (2-го) запроса).

Я знаю, что есть способ сделать это с помощью FutureTask и поиграть с помощью cancel () или с исключением «throw ThreadDead» для Thread, но мне просто интересно, могу ли я это сделатьтак же, как я начал в первую очередь.

спасибо!

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Из вашего вопроса я понял, что вы хотите отменить текущий запущенный поток, если новый поток начался.

Это можно сделать, вызвав метод прерывания потока () , который прервет текущий запущенный поток и вызовет исключение InterruptedException.

Thread t1 = null;
private void exec() {
    t1 = new Thread(new Runnable() {
    public void run() {
    mBind.exec(3);
    }
  }).start();
}

Перед вызовом exec вызовите t1.interrupt ().

1 голос
/ 30 января 2011

Чувствуется себя немного грязным, но не могли бы вы сохранить имя последнего активированного Thread и проверить его в вашем Handler?Что-то вроде:

private static final int MESSAGE_UPDATE_COMPLETE = 0;
private String threadName;

private void exec() {
    Thread thread = new Thread() {
        public void run() {
            // do stuff
            ...
            Message msg = Message.obtain();
            msg.what = MESSAGE_UPDATE_COMPLETE;
            msg.obj = this.getName();
            handler.sendMessage(msg);
        }
    };
    thread.start();
    threadName = thread.getName();
}
...
private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch(msg.what){
        case MESSAGE_UPDATE_COMPLETE:
            if (threadName.equals((String)msg.obj)) {
                // do UI update
            }
            break;
        ...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...