2011-01-30 29 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