Android中的AsyncTask异步加载图片
AsyncTask簡(jiǎn)介:
AsyncTask的特點(diǎn)是任務(wù)在主線程之外運(yùn)行,而回調(diào)方法是在主線程中執(zhí)行,這就有效地避免了使用Handler帶來(lái)的麻煩。
閱讀 AsyncTask的源碼可知,AsyncTask是使用java.util.concurrent 框架來(lái)管理線程以及任務(wù)的執(zhí)行的,concurrent框架是一個(gè)非常 成熟,高效的框架,經(jīng)過(guò)了嚴(yán)格的測(cè)試。這說(shuō)明AsyncTask的設(shè)計(jì)很好的解決了匿名線程存在的問(wèn)題。?
AsyncTask是抽象類,AsyncTask定義了三種泛型類型 Params,Progress和Result。?
1,Params 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請(qǐng)求的URL。
2,Progress 后臺(tái)任務(wù)執(zhí)行的百分比。
3,Result 后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String。?
子類必須實(shí)現(xiàn)抽象方法doInBackground(Params… p) ,在此方法中實(shí)現(xiàn)任務(wù)的執(zhí)行工作,比如連接網(wǎng)絡(luò)獲取數(shù)據(jù)等。通常還應(yīng)該實(shí)現(xiàn)onPostExecute(Result r)方法,因?yàn)閼?yīng)用程序關(guān)心的結(jié)果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創(chuàng) 建實(shí)例。
? ? ? ?AsyncTask的執(zhí)行分為四個(gè)步驟,每一步都對(duì)應(yīng)一個(gè)回調(diào)方法,需要注意的是這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開(kāi)發(fā)者需要做的 就是實(shí)現(xiàn)這些方法。在任務(wù)的執(zhí)行過(guò)程中,這些方法被自動(dòng)調(diào)用,運(yùn)行過(guò)程:
1,onPreExecute() 當(dāng)任務(wù)執(zhí)行之前開(kāi)始調(diào)用此方法,可以在這里顯示進(jìn)度對(duì)話框。2,doInBackground(Params…) 此方法在后臺(tái)線程執(zhí)行,完成任務(wù)的主要工作,通常需要較長(zhǎng)的時(shí)間。在執(zhí)行過(guò)程中可以調(diào)用 publicProgress(Progress…)來(lái)更新任務(wù)的進(jìn)度。?
3,onProgressUpdate(Progress…) 此方法在主線程執(zhí)行,用于顯示任務(wù)執(zhí)行的進(jìn)度。
4,onPostExecute(Result) 此方法在主線程執(zhí)行,任務(wù)執(zhí)行的結(jié)果作為此方法的參數(shù)返回
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是可變數(shù)組參數(shù)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);}} 網(wǎng)絡(luò)權(quán)限:
<uses-permission android:name="android.permission.INTERNET"/>
參考:
http://blog.csdn.net/tianxiangshan/article/details/7871667
http://blog.csdn.net/shineflowers/article/details/41746443
總結(jié)
以上是生活随笔為你收集整理的Android中的AsyncTask异步加载图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于快速排序思想的三个算法题
- 下一篇: Android从网络上获取图片的两种方式