AsyncTask提供了一種在後台執行操作而在UI線程顯示結果的方式,而且開發人員不必操作線程或者handler.
一個AsyncTask定義了三種泛型分別是Params,Progress,Result,還有四個函數分別是onPreExecute ,doInBackground onProgressUpdate,onPostExecute.
AsyncTask必須寫子類繼承來使用.例如
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
AsyncTask一定要在UI線程中執行個體化,調用execute一定要在UI線程,否則會報錯.
Handler如何與當前線程的Looper產生聯絡.
Handler在構造的時候,可以通過Looper.getLooper()擷取當前線程的Looper對象.
而在AsyncTask 中有一個靜態Handler對象,是用來後台線程和UI線程互動的,所以這個AsyncTask必須在UI 線程執行個體化.否則會報錯......
能否在其他線程中聲明Handler,並和主線程通訊Looper.getMainLooper(),測試一下.