Android取消线程

时间:2011-01-30 15:43:37

标签: java android multithreading asynchronous

我正在使用Android进行简单的异步操作,但由于我想多次执行该操作,我不使用AsyncTask,而是使用带有Handler的Thread / Runnable机制来处理消息和人员。但是,当我需要执行第二个操作时,如果它仍处于活动状态,我需要取消之前的操作。

我有这样的事情:

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()方法被第二次调用,gui也用之前的结果更新(我只需要新(第二)请求的结果)。

我知道有一些方法可以使用FutureTask来执行此操作并使用cancel()或使用Thread的'throw ThreadDead'异常,但我只是好奇我是否可以像我从一开始就这样做。

谢谢!

2 个答案:

答案 0 :(得分: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()。

答案 1 :(得分: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;
        ...
        }
    }
}