首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android取消线程

Android取消线程
EN

Stack Overflow用户
提问于 2011-01-30 23:43:37
回答 2查看 3.2K关注 0票数 1

我用Android做了一个简单的异步操作,但由于我想多次执行操作,所以我没有使用AsyncTask,而是使用线程/可运行机制和处理程序来处理消息和人员。但是,当我需要执行第二个操作时,如果前一个操作仍处于活动状态,则需要取消该操作。

我有这样的东西:

代码语言:javascript
复制
private void exec() {
    new Thread(new Runnable() {
    public void run() {
    mBind.exec(3);
    }
  }).start();
}

然后在exec(int a)中,我有一个类似如下的迭代:

代码语言:javascript
复制
for(int i = 0; i<=res.lenght; i++) {
   updateGui();
}

但是在某一时刻,exec()方法被第二次调用,并且gui也用以前的结果进行了更新(我只需要来自new (第二个)请求的结果)。

我知道有办法用FutureTask和cancel()或Thread线程的“抛出ThreadDead”异常来做这件事,但我只是好奇我是否能像一开始一样做这件事。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-31 18:45:12

我从你的问题中得到的理解是,如果新线程启动,你想取消当前正在运行的线程。

这可以通过调用线程的interrupt()方法来完成,这将中断当前正在运行的线程,并抛出InterruptedException。

代码语言:javascript
复制
Thread t1 = null;
private void exec() {
    t1 = new Thread(new Runnable() {
    public void run() {
    mBind.exec(3);
    }
  }).start();
}

在调用exec之前,请调用t1.interrupt()。

票数 2
EN

Stack Overflow用户

发布于 2011-01-31 00:29:10

感觉有点脏,但你能保存最近激活的Thread的名称并在你的Handler中检查它吗?类似于:

代码语言:javascript
复制
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;
        ...
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4843755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档