Android中的AsyncTask异步加载图片
AsyncTask簡介:
AsyncTask的特點是任務在主線程之外運行,而回調方法是在主線程中執行,這就有效地避免了使用Handler帶來的麻煩。
閱讀 AsyncTask的源碼可知,AsyncTask是使用java.util.concurrent 框架來管理線程以及任務的執行的,concurrent框架是一個非常 成熟,高效的框架,經過了嚴格的測試。這說明AsyncTask的設計很好的解決了匿名線程存在的問題。?
AsyncTask是抽象類,AsyncTask定義了三種泛型類型 Params,Progress和Result。?
1,Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
2,Progress 后臺任務執行的百分比。
3,Result 后臺執行任務最終返回的結果,比如String。?
子類必須實現抽象方法doInBackground(Params… p) ,在此方法中實現任務的執行工作,比如連接網絡獲取數據等。通常還應該實現onPostExecute(Result r)方法,因為應用程序關心的結果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創 建實例。
? ? ? ?AsyncTask的執行分為四個步驟,每一步都對應一個回調方法,需要注意的是這些方法不應該由應用程序調用,開發者需要做的 就是實現這些方法。在任務的執行過程中,這些方法被自動調用,運行過程:
1,onPreExecute() 當任務執行之前開始調用此方法,可以在這里顯示進度對話框。2,doInBackground(Params…) 此方法在后臺線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用 publicProgress(Progress…)來更新任務的進度。?
3,onProgressUpdate(Progress…) 此方法在主線程執行,用于顯示任務執行的進度。
4,onPostExecute(Result) 此方法在主線程執行,任務執行的結果作為此方法的參數返回
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout> list_item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="150dp"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_alignParentTop="true" ><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"android:src="@android:drawable/alert_dark_frame" /></LinearLayout> </RelativeLayout> ImageAdapter.java
package com.hust.asynctaskdemo;import java.util.ArrayList;import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView;public class ImageAdapter extends BaseAdapter {private ArrayList<Drawable> imagesArrayList;private Context mContext;private LayoutInflater mInflater;public ImageAdapter(ArrayList<Drawable> imagesArrayList, Context mContext) {super();this.imagesArrayList = imagesArrayList;this.mContext = mContext;mInflater=LayoutInflater.from(this.mContext);}@Overridepublic int getCount() { return imagesArrayList.size();}@Overridepublic Object getItem(int position) {return imagesArrayList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder mHolder=null;if(convertView==null){convertView=mInflater.inflate(R.layout.list_item, null);mHolder=new ViewHolder();mHolder.mImageView=(ImageView) convertView.findViewById(R.id.imageView);convertView.setTag(mHolder);}else{mHolder=(ViewHolder) convertView.getTag();}mHolder.mImageView.setImageDrawable(imagesArrayList.get(position));return convertView;}public class ViewHolder{public ImageView mImageView;} } MainActivity.java
package com.hust.asynctaskdemo;import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List;import android.support.v7.app.ActionBarActivity; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ListView;public class MainActivity extends ActionBarActivity {private ListView mListView;private ArrayList<String> urlList;private ArrayList<Drawable> imagesData;@SuppressWarnings("unchecked")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);urlList=new ArrayList<String>();urlList.add("http://img3.douban.com/view/event_poster/large/public/2a35a85a873e8e7.jpg");urlList.add("http://img3.douban.com/view/event_poster/large/public/ce66e0569742fd7.jpg");urlList.add("http://img3.douban.com/view/event_poster/large/public/4c44752e83900d9.jpg");mListView=(ListView) findViewById(R.id.listview);AsyncTask<ArrayList<String>, Integer, ArrayList<Drawable>> task=new AsyncTask<ArrayList<String>, Integer, ArrayList<Drawable>>(){@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();}@Overrideprotected ArrayList<Drawable> doInBackground(ArrayList<String>... params) {//params是可變數組參數List<String> imageUriList = params[0];ArrayList<Drawable> imageList=new ArrayList<Drawable>();for(String url:imageUriList){try {URL mUrl=new URL(url);Drawable mDrawable=Drawable.createFromStream(mUrl.openStream(), "src");imageList.add(mDrawable);} catch (IOException e) { e.printStackTrace();}}return imageList;}@Overrideprotected void onPostExecute(ArrayList<Drawable> result) {//imagesData=result;ImageAdapter mImageAdapter=new ImageAdapter(result, MainActivity.this);mListView.setAdapter(mImageAdapter);} };task.execute(urlList);}} 網絡權限:
<uses-permission android:name="android.permission.INTERNET"/>
參考:
http://blog.csdn.net/tianxiangshan/article/details/7871667
http://blog.csdn.net/shineflowers/article/details/41746443
總結
以上是生活随笔為你收集整理的Android中的AsyncTask异步加载图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于快速排序思想的三个算法题
- 下一篇: Android从网络上获取图片的两种方式