2015-05-27 1 views
3

Почему растровое изображение возвращается в onNewResultImpl null?Зачем использовать fresco datasource для получения растрового изображения

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()); 
+0

Вы получаете какую-либо ошибку? Если это так, сообщите свой logcat.or еще вы проверили, что ваш источник данных является нулевым или что-то в этом есть? – rogerwar

ответ

12

Я внесла некоторые изменения, чтобы заставить все работать в вашем коде, подумайте над этим. Я также тестировал его, и он работал отлично.

// 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

EDIT: Вы используете fetchEncodedImage, а не fetchDecodedImage. Это означает, что каждый возврат изображения не будет иметь базового растрового изображения. Но если вы измените это на fetchDecodedImage и все еще увидите нулевые битмапы, это будет из-за того, о чем я писал ниже.

Смотрите исходный код здесь: https://github.com/facebook/fresco/blob/master/imagepipeline/src/main/java/com/facebook/imagepipeline/datasource/BaseBitmapDataSubscriber.java#L57-L61

Не все изображения, которые возвращаются CloseableBitmap s, и те, которые не не имеет основное растровое изображение, чтобы вернуться, поэтому этот метод возвращает пустой Bitmap.

+0

hi Binnie, как и вы сказали: closeableImageRef.get() возвращает экземпляр CloseableAnimatedImage, а не CloseableBitmap, поэтому битмап возвращается null. Есть ли способ показать это изображение? – tainy

3

Вы должны позвонить fetchDecodedImage, не fetchEncodedImage,, если вам нужен растровый рисунок.