出门莫恨无人随,书中车马多如簇。这篇文章主要讲述android 安卓异步加载网络图片,与viewpager结合使用示例相关的知识,希望能为你提供帮助。
【1】异步加载图片类AsyncImageLoader
package com.example.testdddleapk.cus; import java.io.IOException; import java.lang.ref.SoftReference; import java.util.HashMap; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; /** * 异步加载图片 */ public class AsyncImageLoader { // 软引用,使用内存做临时缓存 (程序退出,或内存不够则清除软引用) private HashMap< String, SoftReference< Drawable> > imageCache; public AsyncImageLoader() { imageCache = new HashMap< String, SoftReference< Drawable> > (); } /** * 定义回调接口 */ public interface ImageCallback { public void imageLoaded(Drawable imageDrawable, String imageUrl); } /** * 创建子线程加载图片 * 子线程加载完图片交给handler处理(子线程不能更新ui,而handler处在主线程,可以更新ui) * handler又交给imageCallback,imageCallback须要自己来实现,在这里可以对回调参数进行处理 * @param imageUrl :须要加载的图片url * @param imageCallback: * @return */ public Drawable loadDrawable(final String imageUrl,final ImageCallback imageCallback) { //如果缓存中存在图片 ,则首先使用缓存 if (imageCache.containsKey(imageUrl)) { SoftReference< Drawable> softReference = imageCache.get(imageUrl); Drawable drawable = softReference.get(); if (drawable != null) { System.out.println("loadDrawable"); imageCallback.imageLoaded(drawable, imageUrl); //执行回调 return drawable; } }/** * 在主线程里执行回调,更新视图 */ final Handler handler = new Handler() { public void handleMessage(Message message) { System.out.println("handleMessage"); imageCallback.imageLoaded((Drawable) message.obj, imageUrl); } }; /** * 创建子线程访问网络并加载图片 ,把结果交给handler处理 */ new Thread() { @Override public void run() { Drawable drawable = loadImageFromUrl(imageUrl); // 下载完的图片放到缓存里 imageCache.put(imageUrl, new SoftReference< Drawable> (drawable)); Message message = handler.obtainMessage(0, drawable); handler.sendMessage(message); } }.start(); return null; } /** * 下载图片 (注意HttpClient 和httpUrlConnection的区别) */ public Drawable loadImageFromUrl(String url) {try { HttpClient client = new DefaultHttpClient(); client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000*15); HttpGet get = new HttpGet(url); HttpResponse response; response = client.execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); Drawable d = Drawable.createFromStream(entity.getContent(),"src"); return d; } else { return null; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }return null; } //清除缓存 public void clearCache() { if (this.imageCache.size() > 0) { this.imageCache.clear(); } }}
【android 安卓异步加载网络图片,与viewpager结合使用示例】【2】 pagerAdapter的instantiateItem方法
@SuppressLint("NewApi") @Override public Object instantiateItem(final ViewGroup container, final int position) { String url=imgsUrls[position]; Drawable cachedImage = asyncImageLoader.loadDrawable(url, new ImageCallback() { @SuppressLint("NewApi") public void imageLoaded(Drawable imageDrawable,String imageUrl) { ImageView img=(ImageView) viewList.get(position).findViewById(R.id.img); img.setBackground(imageDrawable); container.addView(view); } }); return viewList.get(position); }
推荐阅读
- Android学习笔记--使用HttpURLConnection实现网络下载效果,附带进度条显示
- android构建者(Builder)模式使用方法详解
- Android Studio 2.2 External Build
- jQuery如何使用error()方法(介绍和示例)
- jQuery如何使用addBack()方法(代码示例)
- Python程序如何打印列表中的负数(代码示例)
- Kronos Incorporated面试经验|S1(校园内)
- 算法设计(计算无向图的欧拉路径和回路())
- PHP如何使用Ds Stack push()函数(代码示例)