【问题标题】:Android cancel ThreadAndroid取消线程
【发布时间】:2011-01-30 15:43:37
【问题描述】:

我正在使用 Android 进行简单的 Async 操作,但由于我想多次执行该操作,因此我没有使用 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”异常来执行此操作,但我只是好奇我是否可以按照我一开始的方式执行此操作。

谢谢!

【问题讨论】:

  • 我认为您可以通过创建 AsyncTask 的新实例来多次执行 AsyncTask。如果你有 myTask = new MyTask(); myTask.execute(),您可以使用 myTaskAgain = new MyTask 再次运行任务;我的任务再次执行()。 P.S.:我不确定它们是否可以同时运行,但没有尝试过。我只尝试过同时运行两个不同的 AsyncTask。
  • 谢谢。虽然这不是我的问题,但我必须说我尝试过使用 AsyncTask,它会抛出异常或类似的东西.. 即使这样我也不知道如何取消之前触发迭代的操作。

标签: java android multithreading asynchronous


【解决方案1】:

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

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

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

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

【讨论】:

  • 请注意,InterruptedException 仅在线程调用 wait()、join() 或 sleep() 方法系列时才被调用。你可能想看看docs for Thread interrupt
【解决方案2】:

感觉有点脏,但你能保存最近激活的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;
        ...
        }
    }
}

【讨论】:

  • 我不明白你是怎么理解我的,但是如果启动了新线程,我需要“中断”迭代的执行(for 循环)。就是这样:)
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 2013-10-23
  • 2011-05-12
  • 2020-05-23
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多