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

  

时间: 2024-10-14 11:11:16

Android 利用 AsyncTask 异步读取网络图片的相关文章

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;

Android利用Volley异步加载数据(JSON和图片)完整示例

Android利用Volley异步加载数据(JSON和图片)完整示例 MainActivity.java package cc.testvolley; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v

WP_图片管理机制/异步读取网络图片

项目有这样的需求, 要求窗口加载一揽子图片,为了不让UI阻塞太久,采用异步读取后绑定显示的方案. 图片的下载应该采用并发的过程(等待网络响应会很耗时,一张一张的下载,等待时间太长) 图片的下载不能占用过多的线程数,应有个阀值(图片不是核心业务,不能占用那么多资源) 在图片加载的过程中,如果用户有操作,比如窗口跳转,则未加载完成的图片加载的过程应取消(为了替用户节省流量). 需求就是这么多了,如何实现呢? 思路是这样的,由于需要异步,且需要等待,首先想到使用队列,先让队列排列起来,再定量迭代读取.

Android利用Volley异步加载数据完整详细示例(一)

MainActivity如下: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.RequestQ

Android 利用Service实现下载网络图片至sdk卡

1 package com.example.myapp5; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 /** 9 * Android 利用service实现下载图片功能 10 * @author shaobn 11 * @date

Android利用Volley异步载入数据完整具体演示样例(二)

MainActivity例如以下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageVie

Android利用异步任务AsyncTask发送post请求获取json数据

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l  简单,快捷 l  过程可控 使用的缺点: l  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 AsyncTask介绍 Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理.

Android读取网络图片

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在android4.0之后,已不同意在主线程中进行网络请求操作了, 否则会出现NetworkOnMainThreadException异常. 而为了解决在android4.0之上能够进行网络的请求,能够有两种方法来解决,以读取网络的图片为例,先看效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVzc29uMjAxMjEwM

Android开发之异步详解(二)之AsyncTask

请尊重他人的劳动成果,转载请注明出处:Android开发之异步详解(二)之AsyncTask http://blog.csdn.net/fengyuzhengfan/article/details/40212745 我曾在<Android开发之异步详解(一)之Thread+Handler>一文中介绍过通过Thread+Handler实现异步操作.感兴趣的朋友可以看一下. 虽然Thread+Handler可以实现更新主线程的UI并实现异步,但Thread+Handler模式需要为每一个任务创建一