Fresco:如何将位图添加到缓存中?

时间:2016-02-24 11:30:26

标签: android fresco

我的方案是:我正在创建一个新的位图并保存到本地路径,然后在SimpleDraweeView中显示图像。如果我使用SDV.setImageUri(路径),有时不显示图像。所以我正在使用class UserSerializer < ActiveModel::Serializer attributes :id, :email,:name, :password_digest, :promotion_ids, :api_key has_many :roles end 。如果我下次加载,那么ImageView在加载时会闪烁。我研究闪烁的图像在缓存中是不可用的,这就是它发生的原因。那么如何将图像添加到fersco缓存中呢?

1 个答案:

答案 0 :(得分:0)

您可以使用fresco缓存现有位图

public class DownloadVideoThumbnail extends AsyncTask<String, Void, Bitmap> {
private ImageView bmImage;
private Bitmap bitmapVideo;
private Context context;

public DownloadVideoThumbnail(Context context, ImageView bmImage) {
    this.bmImage = (ImageView) bmImage;
    this.context = context;
}

protected Bitmap doInBackground(String... urls) {

    String urlStr = urls[0];
    if (readFromCacheSync(urlStr) == null) {
        try {
            //Your method call here
            bitmapVideo = retriveVideoFrameFromVideo(urlStr);

        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    } else {
        bitmapVideo = readFromCacheSync(urlStr);
    }
    return null;
}

protected void onPostExecute(Bitmap result) {
    if (bitmapVideo != null) {
        //Load your bitmap here
        bmImage.setImageBitmap(bitmapVideo);
        bmImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
    }
}


public void cacheBitmap(Bitmap bitmap, String url) {
    try {
        CacheKey cacheKey = new SimpleCacheKey(url);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        final byte[] byteArray = stream.toByteArray();
        Fresco.getImagePipelineFactory().getMainFileCache().insert(cacheKey, new WriterCallback() {
            @Override
            public void write(OutputStream outputStream) throws IOException {
                outputStream.write(byteArray);
            }
        });
    } catch (IOException cacheWriteException) {

    }
}

public static Bitmap readFromCacheSync(String imageUrl) {
    CacheKey cacheKey = DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(ImageRequest.fromUri(imageUrl), null);
    StagingArea stagingArea = StagingArea.getInstance();
    EncodedImage encodedImage = stagingArea.get(cacheKey);
    if (encodedImage != null) {

        return BitmapFactory.decodeStream(encodedImage.getInputStream());
    }

    try {
        return BitmapFactory.decodeStream(readFromDiskCache(cacheKey));
    } catch (Exception e) {
        return null;
    }
}


private static InputStream readFromDiskCache(final CacheKey key) throws IOException {
    try {
        FileCache fileCache = ImagePipelineFactory.getInstance().getMainFileCache();
        final BinaryResource diskCacheResource = fileCache.getResource(key);
        if (diskCacheResource == null) {
            FLog.v(TAG, "Disk cache miss for %s", key.toString());
            return null;
        }
        PooledByteBuffer byteBuffer;
        final InputStream is = diskCacheResource.openStream();
        FLog.v(TAG, "Successful read from disk cache for %s", key.toString());
        return is;
    } catch (IOException ioe) {
        return null;
    }
}

public Bitmap retriveVideoFrameFromVideo(String videoPath) throws Throwable {

    Bitmap bitmap = null;
    MediaMetadataRetriever mediaMetadataRetriever = null;
    try {
        mediaMetadataRetriever = new MediaMetadataRetriever();
        if (Build.VERSION.SDK_INT >= 14)
            mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
        else
            mediaMetadataRetriever.setDataSource(videoPath);
        bitmap = mediaMetadataRetriever.getFrameAtTime();
        if (bitmap != null) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
            cacheBitmap(bitmap, videoPath);
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new Throwable(
                "Exception in retriveVideoFrameFromVideo(String videoPath)"
                        + e.getMessage());

    } finally {
        if (mediaMetadataRetriever != null) {
            mediaMetadataRetriever.release();
        }
    }
    return bitmap;
}

}