为什么使用Fresco的数据源获取位图为空

5
为什么在onNewResultImpl中返回的位图为null?
final ImageView imageView = (ImageView) findViewById (R.id.imageView);

ImageRequest request = ImageRequest.fromUri(pic_uri);

ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource dataSource = imagePipeline.fetchEncodedImage(request, this);
CloseableReference<CloseableImage> imageReference = null;
dataSource.subscribe (new BaseBitmapDataSubscriber() {
    @Override
    protected void onNewResultImpl(Bitmap bitmap) {
        LogUtils._d("onNewResultImpl....");
        if(bitmap == null) {
            LogUtils._d("bitmap is null");
        }
        imageView.setImageBitmap(bitmap);
    }

    @Override
    protected void onFailureImpl(DataSource dataSource) {
        LogUtils._d("onFailureImpl....");
    }
}, CallerThreadExecutor.getInstance());

你是否遇到了任何错误?如果是,请发布你的logcat。否则,你是否检查过你的数据源是否为空或者其中有什么内容? - rogerwar
3个回答

14

我对您的代码进行了一些修改,使其能够正常工作,请考虑使用它。我也进行了测试,它运行得非常好。

// To get image using Fresco
ImageRequest imageRequest = ImageRequestBuilder
          .newBuilderWithSource( Uri.parse(getFeedItem(position).feedImageUrl.get(index)))
          .setProgressiveRenderingEnabled(true)
          .build();

ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>> dataSource = 
                              imagePipeline.fetchDecodedImage(imageRequest,mContext);

 dataSource.subscribe(new BaseBitmapDataSubscriber() {

     @Override
     public void onNewResultImpl(@Nullable Bitmap bitmap) {
         // You can use the bitmap in only limited ways
         // No need to do any cleanup.
     }

     @Override
     public void onFailureImpl(DataSource dataSource) {
         // No cleanup required here.
     }

 }, CallerThreadExecutor.getInstance());

4

编辑:你正在使用fetchEncodedImage而不是fetchDecodedImage。这意味着每个图像返回将没有底层位图。但是,如果你将其更改为fetchDecodedImage并仍然看到空的位图,则是因为我下面所写的原因。

在此处查看源代码:https://github.com/facebook/fresco/blob/master/imagepipeline/src/main/java/com/facebook/imagepipeline/datasource/BaseBitmapDataSubscriber.java#L57-L61

并非所有返回的图像都是可关闭位图,并且那些不是可关闭位图的图像没有底层位图可返回,因此此方法返回空位图。


嗨Binnie,就像你所说:closeableImageRef.get() 返回CloseableAnimatedImage实例,而不是CloseableBitmap,因此返回的Bitmap为null。有没有办法显示这个图片? - tainy

3
如果你需要位图,应该调用fetchDecodedImage而不是fetchEncodedImage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接