什麼時候應該使用線程,何時應該使用AsyncTask選項?
按照documentation for AsyncTask
:
的AsyncTask的設計是圍繞線程和處理程序一個輔助類,並不構成通用線程框架。理想情況下,AsyncTasks應該用於短操作(最多幾秒)。如果您需要保持線程長時間運行,強烈建議您使用java.util.concurrent pacakge提供的各種API,例如執行器,ThreadPoolExecutor和FutureTask。
所以,它聽起來就像如果你有一個長期運行的任務,你應該叉自己Thread
或使用ExecutorService
。如果你只是做一個簡短的後臺任務,AsyncTask
是要走的路。
爲短時間請求創建一個線程並創建一個擴展長期網絡操作的AsyncTask的類是否正確?
不,根據上面的文檔,你已經倒過來了。
如果我將使用線程,我將不必爲網絡操作實現一個新類。
無論是AsyncTask
和Thread
需要你定義一個新的類:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
...
}
}
...
// to start it
new DownloadFilesTask().execute(url1, url2, url3);
下面介紹如何使用線程:
private class DownloadFilesTask implements Runnable {
// if you need to pass in args via the constructor
public DownloadFilesTask(URL... urls) {
...
}
public void run() {
// do stuff in the background
}
}
...
// to start it
new Thread(new DownloadFilesTask(url1, url2, url3)).start();
如果你需要從後臺結果任務,那麼你也可以使用Callable
和ExecutorService
類代替:
How to make Callable wait till execution?
AsyncTask
支持get()
爲好。
非常感謝您的答覆,是否真的需要執行所有的程序,即使是一個簡單的http請求..? – idish
什麼是「所有程序」?開始另一個線程?或者編寫樣板代碼來做到這一點? –
是的,編寫樣板代碼。對於其他請求也是如此。 – idish