使用AsyncTask实现图片加载

如上图所示:我们看到的就是使用PrograssDialog进度条和AsyncTask异步任务实现的效果(额,不要看应用名。。。)。下面介绍一下具体的实现流程。

一、首先使用XML布局,布局很简单直接上代码:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     tools:context="com.weifengzz.httpclientdemo.MainActivity$PlaceholderFragment" >
 6 
 7     <Button
 8         android:id="@+id/getImage_btn"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:layout_alignParentLeft="true"
12         android:layout_below="@+id/img"
13         android:layout_marginTop="22dp"
14         android:text="获取图片" />
15 
16     <ImageView
17         android:id="@+id/img"
18         android:layout_width="200dp"
19         android:layout_height="200dp"
20         android:layout_alignParentTop="true"
21         android:layout_centerHorizontal="true"
22         android:scaleType="fitCenter"
23         android:src="@drawable/ic_launcher" />
24 
25 </RelativeLayout>

二、MainActivity类主要就是对组件的初始化。

 1 public class MainActivity extends Activity {
 2     private Button button = null;// 按钮
 3     private ImageView imageView = null;// 图片
 4     private ProgressDialog progressDialog = null;// 进度条
 5     private String imgPath = "http://images.ent.xunlei.com/660x1500/189/120818zknfkvg2vtpupxyjdruovsafnj7mbmikn5yh7mpe.jpg";// 图片的地址
 6     private DownLoadImage downLoadImage = null;// AsyncTask异步任务类
 7 
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState) {
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.activity_main);
12         intView();
13         //点击加载图片
14         button.setOnClickListener(new OnClickListener() {
15 
16             @Override
17             public void onClick(View arg0) {
18                 // TODO Auto-generated method stub
19                 downLoadImage.execute(imgPath);
20             }
21         });
22     }
23 
24     /**
25      * 初始化组件
26      * */
27     private void intView() {
28         button = (Button) findViewById(R.id.getImage_btn);
29         imageView = (ImageView) findViewById(R.id.img);
30         progressDialog = new ProgressDialog(MainActivity.this);
31         downLoadImage = new DownLoadImage(imageView, progressDialog);
32     }
33 }

 三、DownLoadImage类的实现,此类继承了 AsyncTask异步任务类

 1 public class DownLoadImage extends AsyncTask<String, Integer, byte[]> {
 2     private ProgressDialog progressDialog = null;//进度条
 3     private ImageView iv = null; //图片控件
 4     
 5     public DownLoadImage(ImageView imageView,ProgressDialog progressDialog) {
 6         this.progressDialog = progressDialog;
 7         this.iv = imageView;
 8     }
 9     
10     /**
11      * 首次调用的方法,通常我们在此方法中可以初始化一些组件
12      */
13     @Override
14     protected void onPreExecute() {
15         // TODO Auto-generated method stub
16         super.onPreExecute();
17         progressDialog.setTitle("下载");//设置标题
18         progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置样式
19         progressDialog.setMessage("正在加载,请稍后...");//设置显示的文字
20         progressDialog.show();
21     }
22 
23     /**
24      * 执行耗时的操作,请求网络数据 String... params:可变的数组
25      */
26     @Override
27     protected byte[] doInBackground(String... params) {
28         // TODO Auto-generated method stub
29         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
30         int temp = 0;
31         //使用HttpClient获取数据
32         HttpClient httpClient = new DefaultHttpClient();
33         HttpGet hg = new HttpGet(params[0]);
34         try {
35             HttpResponse httpResponse = httpClient.execute(hg);
36             if (httpResponse.getStatusLine().getStatusCode() == 200) {
37                 InputStream inputStream = httpResponse.getEntity().getContent();
38                 long length = httpResponse.getEntity().getContentLength();
39                 int current = 0;
40                 //每次读10个字节,如果读的字节数据比较多的话,进度条会显示的不是那么流畅,会有很大的跳跃感
41                 byte[] bt = new byte[10];
42                 //循环读取数据
43                 while ((temp = inputStream.read(bt)) != -1) {
44                     //如果没有取消就每循环一次更新一次进度条
45                     if (!this.isCancelled()) {
46                         current += temp;
47                         publishProgress((int) ((current / (float) length) * 100));
48                         //输出流
49                         outputStream.write(bt, 0, temp);
50                     }
51                 }
52             }
53         } catch (ClientProtocolException e) {
54             // TODO Auto-generated catch block
55             e.printStackTrace();
56         } catch (IOException e) {
57             // TODO Auto-generated catch block
58             e.printStackTrace();
59         }
60         return outputStream.toByteArray();
61     }
62 
63     /**
64      * 调用完publishProgress之后会执行此方法,更新刻度
65      */
66     @Override
67     protected void onProgressUpdate(Integer... values) {
68         // TODO Auto-generated method stub
69         super.onProgressUpdate(values);
70         progressDialog.setProgress(values[0]);
71     }
72 
73     /**
74      * 运行在UI线程中 执行完doInbackgroud方法之后,系统会调用此方法, 并且把doInbackground方法返回的结果传给此方法
75      */
76     @Override
77     protected void onPostExecute(byte[] result) {
78         // TODO Auto-generated method stub
79         super.onPostExecute(result);
80         // 把byte数组转成Bitmap位图对象
81         Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
82         iv.setImageBitmap(bitmap);
83         // 关闭对话框
84         progressDialog.dismiss();
85     }
86 }

四、最后不要忘记添加网络权限

1   <uses-permission android:name="android.permission.INTERNET"/>

 

posted @ 2015-12-02 14:10  weifengzz  阅读(483)  评论(0编辑  收藏  举报