02 September 2010
android 的AsyncTask

如果你可能要去download、request一個蠻龐大的網頁或者檔案時,

如果是在主要的activity、widget或其他中去作,

那麼想必你的activity、widget或其他的UI會像是被lock住!

很LAG的感覺!

那麼就使用AsyncTask吧!

顧名思義,就是非同步排程(應該可以這樣翻)==

AsyncTask的好處就是可以在background執行,

並不影響前端的UI

下面就是實作方法

先去new一個class並繼承AsyncTask

public class downloadTask extends AsyncTask<String, Void , String>{

public static int iFileSize = 0;
public static double dReadSum = 0;
public static boolean bIsDownload = false;

@Override
protected void onProgressUpdate(Void... values) {

//此method是在呼叫publishProgress()時的才會trigger到的
//可以當配progressBar來使用,這裡不多作說明。

super.onProgressUpdate(values);

}


@Override
protected void onPreExecute() {
//此method是在執行doInBackground以前,才會呼叫的
super.onPreExecute();
}

@Override
protected void onPostExecute(String result) {
//此method是在doInBackground完成以後,才會呼叫的
super.onPostExecute(result);
if (iFileSize == dReadSum){
Log.d("main","下載完成");
}

}

/*
*注意!strUrlFile是一個array..代表著在呼叫此class時
*可以帶入很多個參數(strUrlFile),
*如:new downloadTask().execute("http://www.xxx","http://www.xxx");
*/
protected String doInBackground(String... strUrlFile) {
URL urlFileLocation = null;
HttpURLConnection connFile = null;
try {
int iUrlCount = strUrlFile.length;
for (int i =0 ; i < iUrlCount ; i++){
urlFileLocation = new URL(strUrlFile[i]);
connFile = (HttpURLConnection) urlFileLocation.openConnection();
connFile.setDoInput(true);

InputStream is = connFile.getInputStream();
iFileSize = connFile.getContentLength(); //取得檔案大小

byte[] buffer = new byte[1024];
int len1 = 0;
dReadSum = 0;

while ( (len1 = is.read(buffer)) != -1) {
dReadSum += len1;
publishProgress(dReadSum*100/iFileSize);
}
}


} catch (Exception e) {
Log.d("main","download---" + e.toString());
}

return "";
}


}



呼叫此Class就只要一行:

 new downloadTask().execute("http://www.xxx"); 
/*
*注意,參數其實是可以很多個,如下
*new downloadTask().execute("http://www.xxx","http://www.xxx");
*這樣子此task就會去download兩次
*/











blog comments powered by Disqus