Android:使用Voley从缓存中获取数据时,位图为空

时间:2015-03-10 04:46:55

标签: android image caching bitmap android-volley

我正在使用排球库并成功显示图像。我想从缓存中获取相同的下载图像。这是我的代码:

    private Bitmap getBitmapFromUrl(String url){
    String str = "" ;
    Bitmap bitmap = null ;
    byte[] bytes = null ;
    Cache cache = AppController.getInstance().getRequestQueue().getCache();
    Entry entry = cache.get(url);
    try {
        str = new String(entry.data, "UTF-8");
        bytes = str.getBytes("UTF_8") ;
    } catch (UnsupportedEncodingException e) {      
        e.printStackTrace();
    }
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    bitmap = BitmapFactory.decodeByteArray( bytes, 0,bytes.length,options);
    Log.i(PostItemAdapter.class.getSimpleName(), bitmap+"");
    return bitmap ;
}

我的问题是bitmap对象是null。 谁能告诉我为什么?提前致谢 。

1 个答案:

答案 0 :(得分:0)

我的问题在这个很棒的link的帮助下解决了,我在images包中复制了三个文件:

  • DiskLruImageCache
  • ImageCacheManager
  • BitmapLruImageCache

我还复制了 RequestManager 文件。在从URL创建密钥时, DiskLruImageCache 中也遇到了一个问题,我通过替换此文件中的几行来解决这个问题。

解决方案

- 代码:
第一

@Override
public Bitmap getBitmap( String key ) {

    Bitmap bitmap = null;
    DiskLruCache.Snapshot snapshot = null;
    try {

        snapshot = mDiskCache.get( key );
        ....... etc

第二

@Override
public void putBitmap( String key, Bitmap data ) {

    DiskLruCache.Editor editor = null;
    try {
        editor = mDiskCache.edit( key );
        ......etc

- 新代码:
第一

@Override
public Bitmap getBitmap( String key ) {

    Bitmap bitmap = null;
    DiskLruCache.Snapshot snapshot = null;
    try {

        snapshot = mDiskCache.get( ImageCacheManager.getInstance().createKey(key) );
       ....etc

第二

@Override
public void putBitmap( String key, Bitmap data ) {

    DiskLruCache.Editor editor = null;
    try {

        editor = mDiskCache.edit( ImageCacheManager.getInstance().createKey(key) );
       .....etc

注意: DiskLruImageCache 中的所有修改,除了缓存,您还可以通过此功能将图像保存到SD卡:

    private void saveImageToSD(Bitmap bmp) {
    bytes = new ByteArrayOutputStream();
    bmp.compress(mCompressFormat, 90, bytes);
    file = new File(Environment.getExternalStorageDirectory()+File.separator+"myImage"+(++i)+".jpg");
    try {
        file.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    /*--- create a new FileOutputStream and write bytes to file ---*/
    try {
        fos = new FileOutputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    try {
        fos.write(bytes.toByteArray());
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

调用此函数位于 DiskLruImageCache 文件内的 getBitmap(String URL) 函数内。