Android异步下载网络图片(其二:AsyncTask)
在上一節(jié)中,我們使用Handler、Thread/Runnable 、URL、HttpURLConnection等等來(lái)進(jìn)行異步下載網(wǎng)絡(luò)圖片。
但是采用這種方式有一些缺點(diǎn),如下:
- 線程的開(kāi)銷較大,如果每個(gè)任務(wù)都要?jiǎng)?chuàng)建一個(gè)線程,那么程序的效率要低很多。
- 線程無(wú)法管理,匿名線程創(chuàng)建并啟動(dòng)后就不受程序的控制了,如果有很多個(gè)請(qǐng)求發(fā)送,那么就會(huì)啟動(dòng)非常多的線程,系統(tǒng)將不堪重負(fù)。
- 另外,前面已經(jīng)看到,在新線程中更新UI還必須要引入handler,這讓代碼看上去非常臃腫。
?那么有沒(méi)有比較更好好的實(shí)現(xiàn)方式呢?這個(gè)可以有!它就是AsyncTask
?AsyncTask的特點(diǎn)是任務(wù)在主UI線程之外運(yùn)行,而回調(diào)方法是在主UI線程中,這就有效地避免了使用Handler帶來(lái)的麻煩。?
AsyncTask定義了三種泛型類型 Params,Progress和Result。- Params 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù)。
- Progress 后臺(tái)任務(wù)執(zhí)行的百分比。
- Result 后臺(tái)執(zhí)行任務(wù)返回的結(jié)果。
? 當(dāng)然,使用它還必須覆蓋它的一些抽象方法方法
?doInBackground(Params...)????????執(zhí)行任務(wù)
?onPostExecute(Result)???????????? 返回任務(wù)執(zhí)行的結(jié)果,通常更新UI
?onProgressUpdate (Progress... values)?進(jìn)度更新
?注意:紅色的是必須實(shí)現(xiàn)的。
?第一步:設(shè)計(jì)好UI,與上節(jié)一樣
?第二步:也與上節(jié)一樣。
?第三步:主要是實(shí)例化AsyncTask,并執(zhí)行execute(Params)
?我們必須繼承AsyncTask,并覆蓋它的一些方法,我們這里主要是要獲取網(wǎng)絡(luò)圖片,并保存為Bitmap,以便UI根據(jù)Bitmap來(lái)更新的。
?那么需要為AsyncTask設(shè)置返回的類型參數(shù)為String,Integer,Bitmap 類定義如下:
View Code public class MyASyncTask extends AsyncTask<String, Integer, Bitmap> {?在doInBackground(Params...)??方法中?,接受String ....params,返回我們需要的Bitmap.當(dāng)然我們這里是獲取圖片Bitmap所以要返回Bitmap
??如果你返回的需要是String或者其他復(fù)雜類型時(shí)候,需要修改類的定義參數(shù)類型為你需要返回的類型,當(dāng)然接受參數(shù)也是根據(jù)你的請(qǐng)求需要改變。
View Code @Overrideprotected Bitmap doInBackground(String... params) {Bitmap bitmap=null;try {URL url = new URL(params[0]);HttpURLConnection con=(HttpURLConnection) url.openConnection();con.setDoInput(true);con.connect();InputStream inputStream=con.getInputStream();bitmap=BitmapFactory.decodeStream(inputStream); inputStream.close();} catch (MalformedURLException e) {e.printStackTrace();}catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();} return bitmap;}在?onPostExecute(Result)?中是請(qǐng)求獲得結(jié)果后更新UI部分。你會(huì)看到他的參數(shù)就是我們類中的類型參數(shù)。代碼如下:
View Code //執(zhí)行獲得圖片數(shù)據(jù)后,更新UI:顯示圖片,隱藏進(jìn)度條 @Overrideprotected void onPostExecute(Bitmap Result){ImageView imgView=(ImageView)this.viewGroup.getChildAt(0);imgView.setImageBitmap(Result);ProgressBar bar=(ProgressBar)this.viewGroup.getChildAt(1);bar.setVisibility(View.GONE);}然后怎么用呢?在UI線程中執(zhí)行吧:
MyASyncTask yncTask=new MyASyncTask(this,frameLayout);
???yncTask.execute(params);運(yùn)行結(jié)果與上節(jié)大同小異
總結(jié)
以上是生活随笔為你收集整理的Android异步下载网络图片(其二:AsyncTask)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android异步下载网络图片(其一:H
- 下一篇: Android异步下载网络图片(其三:E