2011-01-30 82 views
1

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

我有这样的事情:

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

然后在EXEC(INT一)我有一个像互为作用:

for(int i = 0; i<=res.lenght; i++) { 
    updateGui(); 
} 

但在一个点上的exec()方法被调用第二时间,gui也会更新以前的结果(我只需要新的(第二个)请求的结果)。

我知道有一种方法可以用FutureTask来做到这一点,并使用cancel()或Thread的'throw ThreadDead'异常来玩,但我只是好奇我是否可以像第一次那样开始。

谢谢!

+0

我想你可以通过创建一个AsyncTask的新实例多次执行一个AsyncTask。如果你有myTask = new MyTask(); myTask.execute(),您可以使用myTaskAgain = new MyTask再次运行任务; myTaskAgain.execute()。 P.S .:我不确定他们是否可以同时运行,还没有尝试过。我只尝试了两个不同的AsyncTasks同时运行。 – Zarah 2011-01-30 16:02:14

+0

谢谢。虽然这不是我的疑问,但我必须说我尝试过使用AsyncTask,它会抛出异常或类似的东西..即使如此,我不知道如何取消之前触发迭代的操作。 – user584513 2011-01-30 16:16:07

回答

2

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

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

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

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

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; 
     ... 
     } 
    } 
} 
+0

我不明白你是如何理解我的,但是如果新线程启动了,我需要'中断'迭代的执行(for循环)。这就是全部:) – user584513 2011-01-30 17:19:09