2013-10-24 46 views
1

我正在創建一個將下載大約30張圖像的應用程序。假設它需要超過10秒。我一直在閱讀有關AsyncTask,我想這不應該使用,因爲任務需要幾秒鐘。在Android上執行長時間運行任務時選擇哪種策略?

AsyncTasks應該理想地用於短操作(在幾秒鐘 最多的。)如果你需要保持爲 長時間運行的線程,強烈建議您使用 提供的各種API諸如Executor,ThreadPoolExecutor和FutureTask的java.util.concurrent pacakge。

在查看ASyncTask的API時,我發現有些方法可以發佈到UI線程。如果我理解了正確的話,更長時間運行任務的更合適的方法是使用FutureTask?這意味着我必須自己發佈更新到UI線程。是否正確使用post(Runnable) method of View

無論我在正確的軌道上,我都需要一些指導。

+0

使用IntentService或後臺服務執行長期任務... –

回答

3

AsyncTasks不遵循活動實例的生命週期。如果你在一個Activity中啓動一個AsyncTask並且你旋轉了這個設備,那麼這個Activity將被銷燬並且一個新的實例將被創建。但AsyncTask不會死。這是建議避免長時間運行任務的AsyncTask的原因之一。

我相信你的情況簡單threading將是足夠的,因爲你只是下載數據。如果您需要更新UI元素,則也可以使用處理程序。

編輯:

在FutureTask正在執行它的工作不能更新UI。 UI只能在完成作業後才能更新。

A FutureTask can be used to wrap a Callable or Runnable object. Because FutureTask 
implements Runnable, a FutureTask can be submitted to an Executor for execution. 
+1

如何啓動如果我使用FutureTask例如更新UI嗎? – Andreas

+0

你可以用FutureTask包裝處理程序,所以你可以用它更新UI。 –

+0

但是,鏈接到該方法後,可以從視圖類然後呢? – Andreas

4

您可以將短操作理解爲與您的活動的生命週期相關的操作。

您可以使用在UI線程上執行的onProgressUpdate()回調更新UI。

但是,如果您的活動在此過程中暫停,則可能會崩潰,因此您應該使用task.cancel(true)取消onPause()中的任務;

如果您需要您的任務以保住您的活動,那麼您應該使用Service或ServiceIntent。前者更復雜一些,因爲您必須管理其生命週期,但提供更多的靈活性。二是該死的簡單,所以我可以給你在這裏一個例子:

public class MyIntentService extends IntentService{ 

public MyIntentService() { 
    super("MyIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    // Background work in a worker thread (async) 

    // You could also send a broadcast if you need to get notified 
    Intent broadcastIntent = new Intent(); 
    broadcastIntent.setAction("whatever"); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent); 
} 
} 

的,你可以,如果從你的活動與

Intent i = new Intent(context, MyIntentService.class); 
context.startService(i); 
+0

那麼你什麼時候使用文檔中提到的AsyncTask的替代品,如FutureTask,Executors等?對此沒有提及。 – Andreas

+0

我從未在我的android項目中使用FutureTask。它是一個通用的Java AsyncTask(它不是特定於Android的),它提供比Thread更靈活的界面。我看不到任何使用情況,其中FutureTask應該偏向AsyncTask(Android特定),因爲後者提供了一種在後臺作業之前,之中和之後與UI線程交互的非常方便的方式。 – znat