Android 中使用 AsyncTask 异步读取网络图片
1.新建Android工程AsyncLoadPicture
新建布局文件activity_main.xml主界面为一个GridView,还有其子项布局文件gridview_item.xml
2.功能主界面MainActivity.java,主代码如下
packagecom.example.asyncloadpicture;
importjava.util.ArrayList;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.os.AsyncTask;
importandroid.os.Bundle;
importandroid.widget.GridView;
/**
*@authorymw
*@data--
*/
publicclassMainActivityextendsActivity{
privateGridViewgridViewImg;
privateArrayList<ImageEntity>imageList=newArrayList<ImageEntity>();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridViewImg=(GridView)findViewById(R.id.gridViewImg);
initData();
}
privatevoidinitData(){
for(inti=;i<;i++){
ImageEntityb=newImageEntity();
b.setImage(BitmapFactory.decodeResource(getResources(),
R.drawable.nopicture));
imageList.add(b);
}
ImageAdapteradapter=newImageAdapter(getApplicationContext(),
imageList);
gridViewImg.setAdapter(adapter);
String[]params={
"http://images.cnitblog.com/i///.png",
"p"};
newImageLoadTask(getApplicationContext(),adapter).execute(params);
}
/**图片异步加载类*/
publicclassImageLoadTaskextendsAsyncTask<String,Void,Void>{
privateImageAdapteradapter;
publicImageLoadTask(Contextcontext,ImageAdapteradapter){
this.adapter=adapter;
}
@Override
protectedVoiddoInBackground(String...params){
Stringurl=params[];//获取传来的参数,图片uri地址
Stringp=params[];
for(inti=;i<adapter.getCount();i++){
ImageEntitybean=(ImageEntity)adapter.getItem(i);
Bitmapbitmap=BitmapFactory.decodeStream(Request
.HandlerData(url));
bean.setImage(bitmap);
publishProgress();//通知去更新UI
}
returnnull;
}
publicvoidonProgressUpdate(Void...voids){
if(isCancelled())
return;
//更新UI
adapter.notifyDataSetChanged();
}
}
/**图片实体*/
publicclassImageEntity{
privateBitmapimage;
publicBitmapgetImage(){
returnimage;
}
publicvoidsetImage(Bitmapimage){
this.image=image;
}
}
}
3.GridView列表图片适配器代码ImageAdapter.java
packagecom.example.asyncloadpicture;
importjava.util.ArrayList;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importcom.example.asyncloadpicture.MainActivity.ImageEntity;
/**
*
*@authorymw
*@data--图片适配器
*/
publicclassImageAdapterextendsBaseAdapter{
privateContext_context;
privateArrayList<ImageEntity>_list;
publicImageAdapter(Contextcontext,ArrayList<ImageEntity>imageList){
this._context=context;
this._list=imageList;
}
@Override
publicintgetCount(){
return_list.size();
}
@Override
publicObjectgetItem(intposition){
return_list.get(position);
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
LayoutInflaterinflater=LayoutInflater.from(_context);
convertView=inflater.inflate(R.layout.gridview_item,null);
ImageViewimgView=(ImageView)convertView.findViewById(R.id.imgView);
ImageEntityb=_list.get(position);
//如果有图片则读取,没有则跳过
if(b.getImage()!=null){
imgView.setImageBitmap(b.getImage());
}
returnconvertView;
}
}
4.请求网络读取图片的类Request.java
packagecom.example.asyncloadpicture;
importjava.io.IOException;
importjava.io.InputStream;
importjava.net.URL;
importjava.net.URLConnection;
importandroid.graphics.drawable.Drawable;
importandroid.util.Log;
/**
*工具类,主要根据url读取图片返回流的方法
*
*@authorymw
*
*/
publicclassRequest{
publicstaticInputStreamHandlerData(Stringurl){
InputStreaminStream=null;
try{
URLfeedUrl=newURL(url);
URLConnectionconn=feedUrl.openConnection();
conn.setConnectTimeout(*);
inStream=conn.getInputStream();
}catch(Exceptione){
e.printStackTrace();
}
returninStream;
}
/**直接返回Drawable对象设置图片*/
publicstaticDrawableloadImageFromNetwork(StringimageUrl){
Drawabledrawable=null;
try{
//可以在这里通过文件名来判断,是否本地有此图片
drawable=Drawable.createFromStream(
newURL(imageUrl).openStream(),"image.jpg");
}catch(IOExceptione){
Log.d("test",e.getMessage());
}
if(drawable==null){
Log.d("test","nulldrawable");
}else{
Log.d("test","notnulldrawable");
}
returndrawable;
}
}
以上内容给大家介绍了Android中使用AsyncTask异步读取网络图片的相关知识,希望对大家有所帮助!