Я делаю простую операцию 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', но мне просто интересно, могу ли я сделать это так же, как я начал в первую очередь.
спасибо!
Что я понял из вашего вопроса, так это то, что вы хотите отменить текущий текущий поток, если новый поток запущен.
Это можно сделать, вызвав метод Thread interrupt(), это прервет текущий текущий поток и вызовет InterruptedException.
Thread t1 = null;
private void exec() {
t1 = new Thread(new Runnable() {
public void run() {
mBind.exec(3);
}
}).start();
}
Перед вызовом exec вызовите t1.interrupt().
Чувствует себя немного грязным, но вы можете сохранить имя последнего активированного 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;
...
}
}
}