Android 利用 AsyncTask 异步读取网络图片

1.新建Android工程AsyncLoadPicture

新建布局文件activity_main.xml主界面为一个GridView,还有其布局文件gridview_item.xml

2.功能主界面MainActivity.java,主代码如下

 1 package com.example.asyncloadpicture;
 2 
 3 import java.util.ArrayList;
 4 
 5 import android.app.Activity;
 6 import android.content.Context;
 7 import android.graphics.Bitmap;
 8 import android.graphics.BitmapFactory;
 9 import android.os.AsyncTask;
10 import android.os.Bundle;
11 import android.widget.GridView;
12 
13 /**
14  * @author ymw
15  * @data 2014-12-03
16  */
17 public class MainActivity extends Activity {
18 
19     private GridView gridViewImg;
20     private ArrayList<ImageEntity> imageList = new ArrayList<ImageEntity>();
21 
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main);
26 
27         gridViewImg = (GridView) findViewById(R.id.gridViewImg);
28         initData();
29     }
30 
31     private void initData() {
32         for (int i = 0; i < 15; i++) {
33             ImageEntity b = new ImageEntity();
34             b.setImage(BitmapFactory.decodeResource(getResources(),
35                     R.drawable.nopicture));
36 
37             imageList.add(b);
38         }
39 
40         ImageAdapter adapter = new ImageAdapter(getApplicationContext(),
41                 imageList);
42         gridViewImg.setAdapter(adapter);
43         String[] params = {
44                 "http://images.cnitblog.com/i/169207/201408/112229149526951.png",
45                 "p2" };
46         new ImageLoadTask(getApplicationContext(), adapter).execute(params);
47     }
48 
49     /** 图片异步加载类 */
50     public class ImageLoadTask extends AsyncTask<String, Void, Void> {
51         private ImageAdapter adapter;
52 
53         public ImageLoadTask(Context context, ImageAdapter adapter) {
54             this.adapter = adapter;
55         }
56 
57         @Override
58         protected Void doInBackground(String... params) {
59             String url = params[0];// 获取传来的参数,图片uri地址
60             String p2 = params[1];
61             for (int i = 0; i < adapter.getCount(); i++) {
62                 ImageEntity bean = (ImageEntity) adapter.getItem(i);
63                 Bitmap bitmap = BitmapFactory.decodeStream(Request
64                         .HandlerData(url));
65                 bean.setImage(bitmap);
66                 publishProgress(); // 通知去更新UI
67             }
68 
69             return null;
70         }
71 
72         public void onProgressUpdate(Void... voids) {
73             if (isCancelled())
74                 return;
75             // 更新UI
76             adapter.notifyDataSetChanged();
77         }
78     }
79 
80     /** 图片实体 */
81     public class ImageEntity {
82         private Bitmap image;
83 
84         public Bitmap getImage() {
85             return image;
86         }
87 
88         public void setImage(Bitmap image) {
89             this.image = image;
90         }
91 
92     }
93 }

 

3.GridView列表图片适配器代码ImageAdapter.java

 1 package com.example.asyncloadpicture;
 2 
 3 import java.util.ArrayList;
 4 
 5 import android.content.Context;
 6 import android.view.LayoutInflater;
 7 import android.view.View;
 8 import android.view.ViewGroup;
 9 import android.widget.BaseAdapter;
10 import android.widget.ImageView;
11 
12 import com.example.asyncloadpicture.MainActivity.ImageEntity;
13 
14 /**
15  * 
16  * @author ymw
17  * @data 2014-12-03 图片适配器
18  */
19 public class ImageAdapter extends BaseAdapter {
20 
21     private Context _context;
22     private ArrayList<ImageEntity> _list;
23 
24     public ImageAdapter(Context context, ArrayList<ImageEntity> imageList) {
25         this._context = context;
26         this._list = imageList;
27     }
28 
29     @Override
30     public int getCount() {
31         return _list.size();
32     }
33 
34     @Override
35     public Object getItem(int position) {
36         return _list.get(position);
37     }
38 
39     @Override
40     public long getItemId(int position) {
41         return position;
42     }
43 
44     @Override
45     public View getView(int position, View convertView, ViewGroup parent) {
46         LayoutInflater inflater = LayoutInflater.from(_context);
47         convertView = inflater.inflate(R.layout.gridview_item, null);
48 
49         ImageView imgView = (ImageView) convertView.findViewById(R.id.imgView);
50         ImageEntity b = _list.get(position);
51         // 如果有图片则读取,没有则跳过
52         if (b.getImage() != null) {
53             imgView.setImageBitmap(b.getImage());
54         }
55         return convertView;
56     }
57 }

 

4.请求网络读取图片的类Request.java

 1 package com.example.asyncloadpicture;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.URL;
 6 import java.net.URLConnection;
 7 
 8 import android.graphics.drawable.Drawable;
 9 import android.util.Log;
10 
11 /**
12  * 工具类,主要根据url读取图片返回流的方法
13  * 
14  * @author ymw
15  * 
16  */
17 public class Request {
18     public static InputStream HandlerData(String url) {
19         InputStream inStream = null;
20 
21         try {
22             URL feedUrl = new URL(url);
23             URLConnection conn = feedUrl.openConnection();
24             conn.setConnectTimeout(10 * 1000);
25             inStream = conn.getInputStream();
26         } catch (Exception e) {
27             e.printStackTrace();
28         }
29 
30         return inStream;
31     }
32 
33     /** 直接返回Drawable对象设置图片 */
34     public static Drawable loadImageFromNetwork(String imageUrl) {
35         Drawable drawable = null;
36         try {
37             // 可以在这里通过文件名来判断,是否本地有此图片
38             drawable = Drawable.createFromStream(
39                     new URL(imageUrl).openStream(), "image.jpg");
40         } catch (IOException e) {
41             Log.d("test", e.getMessage());
42         }
43         if (drawable == null) {
44             Log.d("test", "null drawable");
45         } else {
46             Log.d("test", "not null drawable");
47         }
48 
49         return drawable;
50     }
51 }

 

5.代码实例如下链接:

http://files.cnblogs.com/_ymw/AsyncLoadPicture_%E5%8D%9A%E5%AE%A2%E9%99%84%E4%BB%B6.rar

  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。