如果你可能要去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兩次
*/