现在Android上的图片加载框架有很多,UniversalImageLoader、Picasso、Glide、Volley、Fresco等。我个人常用的是UniversalImageLoader、Picasso这两种,它们各有优点:UniversalImageLoader相对于Picasso内存更好管控,OOM出现的几率会更小些,但加载的图片质量清晰度不如Picasso,如果对图片质量清晰度要求不是特别高,建议使用UniversalImageLoader;Picasso使用比UniversalImageLoader更轻量、简单,加载现实的图片更为清晰。以上只是个人观点
最近在项目中遇到这样的问题,所以使用Picasso加载获取Bitmap,设置给ImageView,有时候显示,有时候不显示,代码如下:
Picasso .with(ScanPicActivity.this) .load(url) .priority(Picasso.Priority.HIGH) .tag(PicassoTAG) .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE) .into(new com.squareup.picasso.Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { //在这里把bitmap设置给imageview } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } });
通过查看Picasso打印的日志发现target被gc回收掉了,原来target使用的是弱引用。
不过Picasso还提供了另一种方法获取bitmap(get()):
fetchBySync(url, new IBitmapCallback() { @Override public void onBitmapFailed() { photoView.setImageResource(R.drawable.icon_error); showToast("图片加载失败!"); } @Override public void onBitmapLoaded(Bitmap bitmap) {
runOnUiThread(new Runnable() { @Override public void run() { //bitmap操作在主线程中完成 } });
}
});
新建子线程加载bitmap
private void fetchBySync(String url, IBitmapCallback target) { new Thread(new Runnable() { @Override public void run() { Bitmap bitmap = null; try { bitmap = Picasso .with(ScanPicActivity.this) .load(url) .priority(Picasso.Priority.HIGH) .tag(PicassoTAG) .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE) .get(); BitMapCacheUtils.saveBmpToSd(ScanPicActivity.this, bitmap, url); } catch (IOException e) { e.printStackTrace(); } if (bitmap == null) { target.onBitmapFailed(); } else { target.onBitmapLoaded(bitmap); } } }).start();}
private interface IBitmapCallback { void onBitmapFailed(); void onBitmapLoaded(Bitmap bitmap); }