任何「長」運行任務必須在後臺線程中執行。我不確定你現在是否正在爲你的任務做這件事,所以如果你不是,那麼有幾種方法可以做到這一點。第一種方法是簡單地使用AsyncTask,第二種方法是創建自己的AbstractExecutorService(AsyncTask使用ThreadPoolExecutor)的實例並使用它將Runnable或Callables發佈到。後面的方法可能會爲您節省很多重置因素,具體取決於您的代碼庫。
假設您現在在後臺線程中運行任務,有必要在UI線程上執行UI更新。還有幾種方法可以做到這一點。一種方法是將方法發佈到方法Activity#runOnUiThread,第二種方法是使用之前已在UI線程上創建的Handler(Activity#runOnUiThread在後臺執行)。所以,假設你的Activity有一個方法#postResults(final Object o),並且你的控制器有方法#doSomething(final Activity activity)。
你的活動看起來像這樣。
public class MyActivity extends Activity {
Controller controller = ....
ExecutorService service = Executors.newFixedThreadPool(10);
private void startTask() {
Runnable r = new Runnable() {
public void run() {
c.doSomething(MyActivity.this);
}
}
service.submit(r);
}
public void postResults(final Object o) {
Runnable r = new Runnable() {
public void run() {
// Update your UI here
}
}
runOnUiThread(r)
}
}
和控制器
public class Controller {
public void doSomething(final Activity activity) {
// Perform some long running task here
activity.postResults(someObject);
}
}
顯然這個例子可以收拾(例如通過一個接口DoSomething的,而不是活動),但希望它應該有足夠的瞭解你需要什麼做:)
如果按照你的建議,那麼我的活動將凍結,直到doSomething完成,即使我把一個線程doSomething;那麼我不會知道什麼時候結果可用,因爲我沒有回叫來通知我它已準備好使用。 –
如果你的方法需要花費很多時間來執行,那麼你可以在你的Activity中使用AsyncTask來完成這項工作:http://developer.android.com/reference/android/os/AsyncTask.html – Hicham