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

1

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

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

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

Затем в exec (int a) у меня есть interation, например:

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

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

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

спасибо!

  • 0
    Я думаю, что вы можете выполнить AsyncTask несколько раз, создав новый экземпляр AsyncTask. Если у вас есть myTask = new MyTask (); myTask.execute (), вы можете снова запустить задачу, используя myTaskAgain = new MyTask; myTaskAgain.execute (). PS: я не уверен, хотя, если они могут работать одновременно, не пробовал это. Я только попытался запустить две разные AsyncTask одновременно.
  • 0
    Благодарю. хотя это не было моей проблемой, я должен сказать, что пытался с AsyncTask, он выдает исключение или что-то в этом роде ... и даже тогда я не знаю, как я могу отменить предыдущее действие, которое вызвало итерацию.
Теги:
multithreading
asynchronous

2 ответа

2
Лучший ответ

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

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

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

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

  • 0
    Обратите внимание, что InterruptedException вызывается только в том случае, если поток вызывает семейство методов wait (), join () или sleep (). Вы могли бы хотеть взглянуть на документы для прерывания Thread
1

Чувствует себя немного грязным, но вы можете сохранить имя последнего активированного 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;
        ...
        }
    }
}
  • 0
    Я не понимаю, как вы меня поняли, но мне нужно «прервать» выполнение итерации (цикл for), если запущен новый поток. Вот и все :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню