使用Picasso获取从网络请求Bitmap

现在Android上的图片加载框架有很多,UniversalImageLoader、Picasso、Glide、Volley、Fresco等。我个人常用的是UniversalImageLoader、Picasso这两种,它们各有优点:UniversalImageLoader相对于Picasso内存更好管控,OOM出现的几率会更小些,但加载的图片质量清晰度不如Picasso,如果对图片质量清晰度要求不是特别高,建议使用UniversalImageLoaderPicasso使用比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);
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值