Android 利用 AsyncTask 异步读取网络图片
1.新建Android工程AsyncLoadPicture
新建布局文件activity_main.xml主界面为一个GridView,还有其子项布局文件gridview_item.xml
2.功能主界面MainActivity.java,主代码如下
package com.example.asyncloadpicture; import java.util.ArrayList; import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.GridView; /**
* @author ymw
* @data 2014-12-03
*/
public class MainActivity extends Activity { private GridView gridViewImg;
private ArrayList<ImageEntity> imageList = new ArrayList<ImageEntity>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); gridViewImg = (GridView) findViewById(R.id.gridViewImg);
initData();
} private void initData() {
for (int i = 0; i < 15; i++) {
ImageEntity b = new ImageEntity();
b.setImage(BitmapFactory.decodeResource(getResources(),
R.drawable.nopicture)); imageList.add(b);
} ImageAdapter adapter = new ImageAdapter(getApplicationContext(),
imageList);
gridViewImg.setAdapter(adapter);
String[] params = {
"https://images0.cnblogs.com/i/169207/201408/112229149526951.png",
"p2" };
new ImageLoadTask(getApplicationContext(), adapter).execute(params);
} /** 图片异步加载类 */
public class ImageLoadTask extends AsyncTask<String, Void, Void> {
private ImageAdapter adapter; public ImageLoadTask(Context context, ImageAdapter adapter) {
this.adapter = adapter;
} @Override
protected Void doInBackground(String... params) {
String url = params[0];// 获取传来的参数,图片uri地址
String p2 = params[1];
for (int i = 0; i < adapter.getCount(); i++) {
ImageEntity bean = (ImageEntity) adapter.getItem(i);
Bitmap bitmap = BitmapFactory.decodeStream(Request
.HandlerData(url));
bean.setImage(bitmap);
publishProgress(); // 通知去更新UI
} return null;
} public void onProgressUpdate(Void... voids) {
if (isCancelled())
return;
// 更新UI
adapter.notifyDataSetChanged();
}
} /** 图片实体 */
public class ImageEntity {
private Bitmap image; public Bitmap getImage() {
return image;
} public void setImage(Bitmap image) {
this.image = image;
} }
}
3.GridView列表图片适配器代码ImageAdapter.java
package com.example.asyncloadpicture; import java.util.ArrayList; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView; import com.example.asyncloadpicture.MainActivity.ImageEntity; /**
*
* @author ymw
* @data 2014-12-03 图片适配器
*/
public class ImageAdapter extends BaseAdapter { private Context _context;
private ArrayList<ImageEntity> _list; public ImageAdapter(Context context, ArrayList<ImageEntity> imageList) {
this._context = context;
this._list = imageList;
} @Override
public int getCount() {
return _list.size();
} @Override
public Object getItem(int position) {
return _list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(_context);
convertView = inflater.inflate(R.layout.gridview_item, null); ImageView imgView = (ImageView) convertView.findViewById(R.id.imgView);
ImageEntity b = _list.get(position);
// 如果有图片则读取,没有则跳过
if (b.getImage() != null) {
imgView.setImageBitmap(b.getImage());
}
return convertView;
}
}
4.请求网络读取图片的类Request.java
package com.example.asyncloadpicture; import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection; import android.graphics.drawable.Drawable;
import android.util.Log; /**
* 工具类,主要根据url读取图片返回流的方法
*
* @author ymw
*
*/
public class Request {
public static InputStream HandlerData(String url) {
InputStream inStream = null; try {
URL feedUrl = new URL(url);
URLConnection conn = feedUrl.openConnection();
conn.setConnectTimeout(10 * 1000);
inStream = conn.getInputStream();
} catch (Exception e) {
e.printStackTrace();
} return inStream;
} /** 直接返回Drawable对象设置图片 */
public static Drawable loadImageFromNetwork(String imageUrl) {
Drawable drawable = null;
try {
// 可以在这里通过文件名来判断,是否本地有此图片
drawable = Drawable.createFromStream(
new URL(imageUrl).openStream(), "image.jpg");
} catch (IOException e) {
Log.d("test", e.getMessage());
}
if (drawable == null) {
Log.d("test", "null drawable");
} else {
Log.d("test", "not null drawable");
} return drawable;
}
}
5.代码实例如下链接:
http://files.cnblogs.com/_ymw/AsyncLoadPicture_%E5%8D%9A%E5%AE%A2%E9%99%84%E4%BB%B6.rar
Android 利用 AsyncTask 异步读取网络图片的更多相关文章
- Android 多线程----AsyncTask异步任务详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- android 开发-AsyncTask异步任务的实现
AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过 ...
- Android中AsyncTask异步
今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...
- Android使用AsyncTask异步线程网络通信获取数据(get json)
摘要: android 4.0以上强制要求不能在主线程执行耗时的网络操作,网络操作需要使用Thead+Handler或AsyncTask,本文将介绍AsyncTask的使用方法. 内容: 1.添加Ht ...
- Android 利用Service实现下载网络图片至sdk卡
package com.example.myapp5; import android.app.Activity; import android.content.Intent; import andro ...
- WP_图片管理机制/异步读取网络图片
项目有这样的需求, 要求窗口加载一揽子图片,为了不让UI阻塞太久,采用异步读取后绑定显示的方案. 图片的下载应该采用并发的过程(等待网络响应会很耗时,一张一张的下载,等待时间太长) 图片的下载不能占用 ...
- Android利用Volley异步载入数据完整具体演示样例(二)
MainActivity例如以下: package cc.y; import android.app.Activity; import android.content.Context; import ...
- Android利用Handler异步获取子线程中的产生的值
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 近段时间有一个需求:在线获取图片并且显示在界面 ...
- Android读取网络图片
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在android4.0之后,已不同意在主线程中进行网络请求操作了, 否则会出现N ...
随机推荐
- svn TortoiseSVN 回滚版本
原文链接: http://keenwon.com/1072.html SVN是一个版本管理工具,在工作中经常使用,尤其是多人合作开发的时候,版本管理显得更加重要.需要使用回退的场景往往都比较" ...
- Java代码中获取配置文件(config.properties)中内容的两种方法
方法千千万,本人暂时只总结了两种方法. (1)config.properties中的内容如图 在applicationContext.xml中配置 <!-- 引入配置文件 --> < ...
- linux udp c/s
一.UDP C/S编程的步骤如下图所示 二.与TCP C/S通信的区别在于:服务端没有设置监听和等待连接的过程.客户端没有连接服务端的过程.基于UDP的通信时不可靠地,面向无连接的,发送的数据无法确切 ...
- Javascript进阶:对象实例属性和方法
Ecmascript中,Object类型是所有它的实例的基础.换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中. Object的每个实例都具有以下属性和方法,这些都能方便于我 ...
- USACO Section1.4 Mother's Milk 解题报告
milk3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section1.2 Name That Number 解题报告
namenum解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
- NGUI注册事件的三种方式
1.第一种方式 当一个元素要执行某个方法,而这个方法在此元素赋予的脚本上有,那么直接会调用此方法,但此方法的名称必须是内置的固定名称,例如OnClick,OnMouseOver,OnMouseOut等 ...
- python命名空间、作用域、闭包与传值传引用
(以下内容,均基于python3) 最近在看python函数部分,讲到了python的作用域问题,然后又讲了Python的闭包问题. 在做作业的时候,我遇到了几个问题,下面先来看作业. 一. 作业1: ...
- pyinstaller打包自己的python程序
使用Pyinstaller打包步骤如下 1. 安装pyinstaller pip install pyinstaller 查看安装的版本 pyinstaller --version 2. 给脚本加密 ...
- SVN客户端使用手册
使用svn进行源代码版本控制,代码管理利器. 优点: 使用方便,与文件管理器集成.速度快,稳定. 实现代码比较,比如对历史和当前代码进行比较. 解决多人同时编写代码时代码重复修改困难. 安装: 下载网 ...