首页 > 代码库 > Android 利用 AsyncTask 异步读取网络图片
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 ymw15 * @data 2014-12-0316 */17 public class MainActivity extends Activity {18 19 private GridView gridViewImg;20 private ArrayList<ImageEntity> imageList = new ArrayList<ImageEntity>();21 22 @Override23 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 @Override58 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(Request64 .HandlerData(url));65 bean.setImage(bitmap);66 publishProgress(); // 通知去更新UI67 }68 69 return null;70 }71 72 public void onProgressUpdate(Void... voids) {73 if (isCancelled())74 return;75 // 更新UI76 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 ymw17 * @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 @Override30 public int getCount() {31 return _list.size();32 }33 34 @Override35 public Object getItem(int position) {36 return _list.get(position);37 }38 39 @Override40 public long getItemId(int position) {41 return position;42 }43 44 @Override45 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 ymw15 * 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
Android 利用 AsyncTask 异步读取网络图片
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。