2012-09-26 61 views
1

我將在我的android應用程序中有大約10個甚至更多http發佈請求,其中大多數都是非常短的時間。我的android應用程序中有多個http請求。線程

據我所知,我無法在我的UI線程上執行任何網絡操作。

解決方案將使用AsyncTask或使用線程。

如果我將使用AsyncTask,我將不得不創建一個自定義的類爲該請求。

如果我將使用線程,我將不必爲網絡操作實現一個新類。

所以,我的問題是,什麼時候應該使用線程,什麼時候應該使用AsyncTask選項? 爲短時間請求創建一個線程並創建一個類來擴展長期網絡操作中的AsyncTask是否正確?

回答

1

即使你使用Thread.start(),你仍然需要創建的Runnable一個子類(或Thread一個子類)做的工作在你創建新類兩種方式 - 也許唯一的區別是,如果你正在創建匿名類與頂級命名類。

你不應該根據你是否需要創建一個新課程的決定,因爲成本很小 - 你創建一個新文件,它有不同的結構等等。這是一個簡單的一次性成本。

在我看來,這個決定應該基於您是否想要所有the extra logic and functionality that AsyncTask優惠。

+0

非常感謝您的答覆,是否真的需要執行所有的程序,即使是一個簡單的http請求..? – idish

+0

什麼是「所有程序」?開始另一個線程?或者編寫樣板代碼來做到這一點? –

+0

是的,編寫樣板代碼。對於其他請求也是如此。 – idish

1

什麼時候應該使用線程,何時應該使用AsyncTask選項?

按照documentation for AsyncTask

的AsyncTask的設計是圍繞線程和處理程序一個輔助類,並不構成通用線程框架。理想情況下,AsyncTasks應該用於短操作(最多幾秒)。如果您需要保持線程長時間運行,強烈建議您使用java.util.concurrent pacakge提供的各種API,例如執行器,ThreadPoolExecutor和FutureTask。

所以,它聽起來就像如果你有一個長期運行的任務,你應該叉自己Thread或使用ExecutorService。如果你只是做一個簡短的後臺任務,AsyncTask是要走的路。

爲短時間請求創建一個線程並創建一個擴展長期網絡操作的AsyncTask的類是否正確?

不,根據上面的文檔,你已經倒過來了。

如果我將使用線程,我將不必爲網絡操作實現一個新類。

無論是AsyncTaskThread需要你定義一個新的類:

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(); 

如果你需要從後臺結果任務,那麼你也可以使用CallableExecutorService類代替:

How to make Callable wait till execution?

AsyncTask支持get()爲好。

相關問題