android 异步下载图片
程序员文章站
2022-06-30 11:31:48
...
SyncImageLoader 图片异步下载工具类
package mars.async.down.utils; import java.lang.ref.SoftReference; import java.net.URL; import java.util.HashMap; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; public class SyncImageLoader { private HashMap<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>(); // 根据URL从网络上下载图片,生成Drawable对象 public Drawable loadImageFormUrl(String imageUrl) { try { return Drawable.createFromStream(new URL(imageUrl).openStream(), "src"); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) { // 判断缓存中是否有imageUrl这个缓存存在 if (imageCache.containsKey(imageUrl)) { SoftReference<Drawable> softReference = imageCache.get(imageUrl); if (softReference.get() != null) { return softReference.get(); } } final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { imageCallback.imageLoaded((Drawable) msg.obj); } }; // 缓存中不存在的话,启动异步线程下载图片 new Thread() { @Override public void run() { // 将图片放入缓存 Drawable drawable = loadImageFormUrl(imageUrl); imageCache.put(imageUrl, new SoftReference<Drawable>(drawable)); Message msg = handler.obtainMessage(0, drawable); handler.sendMessage(msg); } }.start(); return null; } // 回调函数,图片加载完毕后调用该函数 public interface ImageCallback { public void imageLoaded(Drawable imageDrawable); } }
CallbackImplements 回调接口实现类。
package mars.async.down.utils; import android.graphics.drawable.Drawable; import android.widget.ImageView; public class CallbackImplements implements SyncImageLoader.ImageCallback { private ImageView imageView; public CallbackImplements(ImageView imageView) { super(); this.imageView = imageView; } @Override public void imageLoaded(Drawable imageDrawable) { imageView.setImageDrawable(imageDrawable); } }
在Activity中调用
package mars.async.down; import mars.async.down.utils.CallbackImplements; import mars.async.down.utils.SyncImageLoader; import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.widget.ImageView; public class MainActivity extends Activity { private SyncImageLoader syncImageLoader = new SyncImageLoader(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); loadImage("http://www.android.com/images/icon-partners.png", R.id.imageView1); loadImage("http://www.android.com/images/icon-dev.png", R.id.imageView2); loadImage("http://www.android.com/images/icon-market.png", R.id.imageView3); } // url:图片的url地址 // id:ImageView控件的ID private void loadImage(String url, int id) { ImageView imageView = (ImageView) findViewById(id); CallbackImplements callbackImplements = new CallbackImplements( imageView); Drawable cacheImage = syncImageLoader.loadDrawable(url, callbackImplements); // 如果图片缓存存在,则在外部设置image.否则是调用的callback函数设置 if (cacheImage != null) { imageView.setImageDrawable(cacheImage); } } }
上一篇: js学习笔记之事件处理模型
下一篇: iOS Moya实现OAuth请求的方法