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异步读取网络图片的相关知识,希望对大家有所帮助!