我用Android做了一个简单的异步操作,但由于我想多次执行操作,所以我没有使用AsyncTask,而是使用线程/可运行机制和处理程序来处理消息和人员。但是,当我需要执行第二个操作时,如果前一个操作仍处于活动状态,则需要取消该操作。
我有这样的东西:
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也用以前的结果进行了更新(我只需要来自new (第二个)请求的结果)。
我知道有办法用FutureTask和cancel()或Thread线程的“抛出ThreadDead”异常来做这件事,但我只是好奇我是否能像一开始一样做这件事。
谢谢!
发布于 2011-01-31 18:45:12
我从你的问题中得到的理解是,如果新线程启动,你想取消当前正在运行的线程。
这可以通过调用线程的interrupt()方法来完成,这将中断当前正在运行的线程,并抛出InterruptedException。
Thread t1 = null;
private void exec() {
t1 = new Thread(new Runnable() {
public void run() {
mBind.exec(3);
}
}).start();
}在调用exec之前,请调用t1.interrupt()。
发布于 2011-01-31 00:29:10
感觉有点脏,但你能保存最近激活的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;
...
}
}
}https://stackoverflow.com/questions/4843755
复制相似问题