編輯:Android開發實例
在上一節中,我們使用Handler、Thread/Runnable 、URL、HttpURLConnection等等來進行異步下載網絡圖片。
但是采用這種方式有一些缺點,如下:
那麼有沒有比較更好好的實現方式呢?這個可以有!它就是AsyncTask
AsyncTask的特點是任務在主UI線程之外運行,而回調方法是在主UI線程中,這就有效地避免了使用Handler帶來的麻煩。
AsyncTask定義了三種泛型類型 Params,Progress和Result。當然,使用它還必須覆蓋它的一些抽象方法方法
doInBackground(Params...)
執行任務
onPostExecute(Result) 返回任務執行的結果,通常更新UI
onProgressUpdate (Progress... values) 進度更新
注意:紅色的是必須實現的。
第一步:設計好UI,與上節一樣
第二步:也與上節一樣。
第三步:主要是實例化AsyncTask,並執行execute(Params)
我們必須繼承AsyncTask,並覆蓋它的一些方法,我們這裡主要是要獲取網絡圖片,並保存為Bitmap,以便UI根據Bitmap來更新的。
那麼需要為AsyncTask設置返回的類型參數為String,Integer,Bitmap 類定義如下:
public class MyASyncTask extends AsyncTask<String, Integer, Bitmap> {
在doInBackground(Params...) 方法中 ,接受String ....params,返回我們需要的Bitmap.當然我們這裡是獲取圖片Bitmap所以要返回Bitmap
如果你返回的需要是String或者其他復雜類型時候,需要修改類的定義參數類型為你需要返回的類型,當然接受參數也是根據你的請求需要改變。
@Override
protected 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) 中是請求獲得結果後更新UI部分。你會看到他的參數就是我們類中的類型參數。代碼如下:
//執行獲得圖片數據後,更新UI:顯示圖片,隱藏進度條
@Override
protected 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線程中執行吧:
MyASyncTask yncTask=new MyASyncTask(this,frameLayout);
yncTask.execute(params);
運行結果與上節大同小異
之前在一篇文章中已經講過了菜單項的創建方法,但是那種方法效率較低,維護不易,現在實現另一種方法創建菜單。 MenuInflater,通過此類我們可以輕松的創建菜單
主界面CheckBoxinListViewActivity.java代碼如下: 代碼如下: public class CheckBoxinListViewActi
學習目的: 1、掌握在Android中如何插入圖片 圖片的加入可以立刻讓您的程序增色不少,我們樣例選用一張Android機器人(picture.jpg),您可以使
BroadcastReceiver 是系統全局廣播監聽類, 其主要方法是onReceive(),自定義的廣播類繼承於它並實現自己的onReceive()處理邏輯B