Android 哈希映射返回空值

Android 哈希映射返回空值,android,bitmap,Android,Bitmap,我正在尝试下载图像并将所有下载的图像保存在哈希映射中。我尝试了以下代码: public class ImageAdapter extends BaseAdapter{ private final Context mContext; final String[] mImages; private LayoutInflater mInflater; private static final String TAG = ImageActivity.class.getSimp

我正在尝试下载图像并将所有下载的图像保存在哈希映射中。我尝试了以下代码:

public class ImageAdapter extends BaseAdapter{
    private final Context mContext;
   final String[] mImages;
    private LayoutInflater mInflater;
    private static final String TAG = ImageActivity.class.getSimpleName();
  public ImageAdapter(Context context, String[] images){
      mContext=context;
      mImages=images;
      mInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  }


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mImages.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return mImages[position];
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    private static class ViewHolder {
        ImageView imageView;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView==null){
            viewHolder=new ViewHolder();
            convertView=mInflater.inflate(R.layout.image_layout, parent, false);
            viewHolder.imageView=(ImageView) convertView.findViewById(R.id.image_View);
            convertView.setTag(viewHolder);
        }
        else{
            viewHolder=(ViewHolder) convertView.getTag();

        }
        String imageUrl=mImages[position];
        ImageDownloader downloader=new ImageDownloader();
        Bitmap value=downloader.urlMap.get(imageUrl);
        Log.d(TAG, "Print Url:" + value);
        if(value==null){

        downloader.download(imageUrl,viewHolder.imageView);
        }
        else
            viewHolder.imageView.setImageBitmap(value);
        return convertView;

        }

}
但在调试和检查时,该值包含空值。它应该包含一个位图值

public class ImageDownloader {
    private static final int IO_BUFFER_SIZE = 8 * 1024;
    private static final String TAG = ImageActivity.class.getSimpleName();
    final HashMap<String, Bitmap> urlMap=new HashMap<String, Bitmap>();
     public void download(String url, ImageView imageView) {
         downloadBitmap(url, imageView);

     }


    private void downloadBitmap(final String url,final ImageView imageView) {

        new AsyncTask<Void, Void, Bitmap>() {

            @Override
            protected Bitmap doInBackground(Void... params) {
                return downloadUrlToStream(url, imageView);
            }

            protected void onPostExecute(Bitmap bitmap) {
                imageView.setImageBitmap(bitmap);
                urlMap.put(url, bitmap);
                 Log.d(TAG, "Print value:" + urlMap);
            };
        }.execute();

    }
公共类ImageDownloader{
专用静态最终输入输出缓冲区大小=8*1024;
私有静态最终字符串标记=ImageActivity.class.getSimpleName();
final HashMap urlMap=新HashMap();
公共void下载(字符串url,ImageView){
下载位图(url、imageView);
}
私有void下载位图(最终字符串url,最终图像视图){
新建异步任务(){
@凌驾
受保护位图doInBackground(无效…参数){
返回downloadUrlToStream(url,imageView);
}
受保护的void onPostExecute(位图){
设置图像位图(位图);
放置(url,位图);
Log.d(标签,“打印值:”+urlMap);
};
}.execute();
}

为什么不从哈希映射中检索值?

每次下载都会创建一个新的下载程序:

ImageDownloader downloader=new ImageDownloader();
downloader.download(imageUrl,viewHolder.imageView);
并且您的urlMap(存储下载的位图)不是静态的:

final HashMap<String, Bitmap> urlMap=new HashMap<String, Bitmap>();
final HashMap urlMap=new HashMap();
因此,您实际上丢失了下载的位图,因为您没有存储对ImageDownloader的任何引用

但是,您不应该将其设置为静态。您很快就会耗尽内存,因为这样可以将所有位图存储在内存中

推荐的解决方案是使用LRUCache。它非常容易使用,唯一重要的是重写
sizeOf
correct。以下是供您使用的文档:


}

如果要尝试LRU缓存,可以使用此代码

public class GalleryAdapter extends BaseAdapter {

AlertDialog alertDialog = null;
List<GalleryDTO> mDatalist;
Activity context;
private LruCache<String, Bitmap> mMemoryCache;
LocationHandler mLocationHandler = null;
public GalleryAdapter(Activity context, List<GalleryDTO> mDatalist) {
    this.context = context;
    this.mDatalist = mDatalist;
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;
    mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            return (int) (getSizeInBytes(bitmap) / 1024);
        }
    };

}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}

public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

public long getSizeInBytes(Bitmap bitmap) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        return bitmap.getByteCount();
    } else {
        return bitmap.getRowBytes() * bitmap.getHeight();
    }
}

@Override
public int getCount() {

    return mDatalist.size();
}

@Override
public Object getItem(int position) {

    return mDatalist.get(position);
}

@Override
public long getItemId(int position) {

    return mDatalist.get(position).photoId;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = context.getLayoutInflater().inflate(
                R.layout.list_item_gallery, parent, false);
        holder = new ViewHolder();
        holder.mPhoto = (ImageView) convertView
                .findViewById(R.id.img_photo);
        holder.mProgress = (ProgressBar) convertView
                .findViewById(R.id.pg_list_item);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    GalleryDTO data = (GalleryDTO) getItem(position);
    loadBitmap(data.photoName, holder);

    return convertView;
}

private static class ViewHolder {
    protected ImageView mPhoto;
    protected ProgressBar mProgress;
}

public void loadBitmap(String respath, ViewHolder holder) {
    final String imageKey = respath;
    final Bitmap bitmap = getBitmapFromMemCache(imageKey);
    if (bitmap != null) {
        holder.mPhoto.setImageBitmap(bitmap);
        holder.mProgress.setVisibility(View.GONE);
    } else {
        if (cancelPotentialWork(respath, holder.mPhoto, holder.mProgress)) {
            final BitmapWorkerTask task = new BitmapWorkerTask(
                    holder.mPhoto, holder.mProgress);
            final AsyncDrawable asyncDrawable = new AsyncDrawable(
                    context.getResources(), holder.mPlaceHolderBitmap, task);
            holder.mPhoto.setImageDrawable(asyncDrawable);
            task.execute(respath);
        }
    }

}

class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    private final WeakReference<ProgressBar> progressbarReference;
    private String data = "";

    public BitmapWorkerTask(ImageView imageView, ProgressBar progressBar) {
        imageViewReference = new WeakReference<ImageView>(imageView);
        progressbarReference = new WeakReference<ProgressBar>(progressBar);
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        data = params[0];
        final Bitmap bitmap = downloadUrlToStream(url);
        addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
        return bitmap;

    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            final ProgressBar mProgressBar = progressbarReference.get();
            final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(
                    imageView, mProgressBar);
            if (this == bitmapWorkerTask && imageView != null) {
                imageView.setImageBitmap(bitmap);
                if (mProgressBar != null)
                    mProgressBar.setVisibility(View.GONE);
            }
        }
    }
}

static class AsyncDrawable extends BitmapDrawable {
    private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

    public AsyncDrawable(Resources res, Bitmap bitmap,
            BitmapWorkerTask bitmapWorkerTask) {
        super(res, bitmap);
        bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(
                bitmapWorkerTask);
    }

    public BitmapWorkerTask getBitmapWorkerTask() {
        return bitmapWorkerTaskReference.get();
    }
}

public static boolean cancelPotentialWork(String data, ImageView imageView,
        ProgressBar progressBar) {
    final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(
            imageView, progressBar);

    if (bitmapWorkerTask != null) {
        final String bitmapData = bitmapWorkerTask.data;
        if (bitmapData != data) {
            bitmapWorkerTask.cancel(true);
        } else {
            return false;
        }
    }
    return true;
}

private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView,
        ProgressBar progressBar) {
    if (imageView != null) {
        final Drawable drawable = imageView.getDrawable();
        if (drawable instanceof AsyncDrawable) {
            final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
            return asyncDrawable.getBitmapWorkerTask();
        }
    }
    return null;
}

}
公共类GalleryAdapter扩展了BaseAdapter{
AlertDialog AlertDialog=null;
列出mDatalist;
活动语境;
私人LruCache-mMemoryCache;
LocationHandler mlLocationHandler=null;
公共GalleryAdapter(活动上下文,列表mDatalist){
this.context=上下文;
this.mDatalist=mDatalist;
final int maxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
最终int cacheSize=maxMemory/8;
mMemoryCache=新的LruCache(缓存大小){
@凌驾
受保护的int-sizeOf(字符串键、位图){
返回(int)(getSizeInBytes(位图)/1024);
}
};
}
public void addBitmapToMemoryCache(字符串键、位图){
if(getBitmapFromMemCache(key)==null){
mMemoryCache.put(键,位图);
}
}
公共位图getBitmapFromMemCache(字符串键){
返回mMemoryCache.get(key);
}
公共长getSizeInBytes(位图){
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.HONEYCOMB){
返回bitmap.getByteCount();
}否则{
返回bitmap.getRowBytes()*bitmap.getHeight();
}
}
@凌驾
public int getCount(){
返回mDatalist.size();
}
@凌驾
公共对象getItem(int位置){
返回mDatalist.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回mDatalist.get(position).photoId;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=context.GetLayoutFlater().充气(
R.layout.list\u item\u gallery,父项,false);
holder=新的ViewHolder();
holder.mPhoto=(图像视图)convertView
.findviewbyd(R.id.img_照片);
holder.mProgress=(进度条)convertView
.findViewById(R.id.pg\U列表项目);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
GalleryDTO数据=(GalleryDTO)获取项目(位置);
加载位图(data.photoName,holder);
返回视图;
}
私有静态类视图持有者{
受保护的图像视图mPhoto;
受保护的进程条进程;
}
公共void加载位图(字符串响应、视图持有者){
最终字符串imageKey=respath;
最终位图=getBitmapFromMemCache(imageKey);
if(位图!=null){
holder.mPhoto.setImageBitmap(位图);
holder.mProgress.setVisibility(View.GONE);
}否则{
if(取消潜在工作(respath,holder.mPhoto,holder.mProgress)){
最终BitmapWorkerTask任务=新建BitmapWorkerTask(
holder.mPhoto,holder.mProgress);
最终AsyncDrawable AsyncDrawable=新的AsyncDrawable(
context.getResources(),holder.mPlaceHolderBitmap,task);
holder.mPhoto.setImageDrawable(异步Drawable);
task.execute(respath);
}
}
}
类BitmapWorkerTask扩展了AsyncTask{
私有最终WeakReference imageViewReference;
私人最终WeakReference progressbarReference;
私有字符串数据=”;
公共位图工作任务(ImageView ImageView、ProgressBar ProgressBar){
imageViewReference=新的WeakReference(imageView);
progressbarReference=新的WeakReference(progressBar);
}
@凌驾
受保护位图doInBackground(字符串…参数){
数据=参数[0];
最终位图=下载URLTOStream(url);
addBitmapToMemoryCache(String.valueOf(params[0]),位图);
返回位图;
}
@凌驾
受保护的void onPostExecute(位图){
如果(isCancelled()){
位图=空;
}
if(imageViewReference!=null&&bitmap!=null){
最终ImageView=imageViewReference.get();
final ProgressBar mProgressBar=progressbarReference.get();
最终BitmapWorkerTask BitmapWorkerTask=getBitmapWorkerTask(
图像视图,mProgressBar);
if(this==bitmapWorkerTask&&imageView!=null){
设置图像位图(位图);
if(mProgressBar!=null)
public class GalleryAdapter extends BaseAdapter {

AlertDialog alertDialog = null;
List<GalleryDTO> mDatalist;
Activity context;
private LruCache<String, Bitmap> mMemoryCache;
LocationHandler mLocationHandler = null;
public GalleryAdapter(Activity context, List<GalleryDTO> mDatalist) {
    this.context = context;
    this.mDatalist = mDatalist;
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;
    mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            return (int) (getSizeInBytes(bitmap) / 1024);
        }
    };

}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}

public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

public long getSizeInBytes(Bitmap bitmap) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        return bitmap.getByteCount();
    } else {
        return bitmap.getRowBytes() * bitmap.getHeight();
    }
}

@Override
public int getCount() {

    return mDatalist.size();
}

@Override
public Object getItem(int position) {

    return mDatalist.get(position);
}

@Override
public long getItemId(int position) {

    return mDatalist.get(position).photoId;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = context.getLayoutInflater().inflate(
                R.layout.list_item_gallery, parent, false);
        holder = new ViewHolder();
        holder.mPhoto = (ImageView) convertView
                .findViewById(R.id.img_photo);
        holder.mProgress = (ProgressBar) convertView
                .findViewById(R.id.pg_list_item);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    GalleryDTO data = (GalleryDTO) getItem(position);
    loadBitmap(data.photoName, holder);

    return convertView;
}

private static class ViewHolder {
    protected ImageView mPhoto;
    protected ProgressBar mProgress;
}

public void loadBitmap(String respath, ViewHolder holder) {
    final String imageKey = respath;
    final Bitmap bitmap = getBitmapFromMemCache(imageKey);
    if (bitmap != null) {
        holder.mPhoto.setImageBitmap(bitmap);
        holder.mProgress.setVisibility(View.GONE);
    } else {
        if (cancelPotentialWork(respath, holder.mPhoto, holder.mProgress)) {
            final BitmapWorkerTask task = new BitmapWorkerTask(
                    holder.mPhoto, holder.mProgress);
            final AsyncDrawable asyncDrawable = new AsyncDrawable(
                    context.getResources(), holder.mPlaceHolderBitmap, task);
            holder.mPhoto.setImageDrawable(asyncDrawable);
            task.execute(respath);
        }
    }

}

class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    private final WeakReference<ProgressBar> progressbarReference;
    private String data = "";

    public BitmapWorkerTask(ImageView imageView, ProgressBar progressBar) {
        imageViewReference = new WeakReference<ImageView>(imageView);
        progressbarReference = new WeakReference<ProgressBar>(progressBar);
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        data = params[0];
        final Bitmap bitmap = downloadUrlToStream(url);
        addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
        return bitmap;

    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            final ProgressBar mProgressBar = progressbarReference.get();
            final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(
                    imageView, mProgressBar);
            if (this == bitmapWorkerTask && imageView != null) {
                imageView.setImageBitmap(bitmap);
                if (mProgressBar != null)
                    mProgressBar.setVisibility(View.GONE);
            }
        }
    }
}

static class AsyncDrawable extends BitmapDrawable {
    private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

    public AsyncDrawable(Resources res, Bitmap bitmap,
            BitmapWorkerTask bitmapWorkerTask) {
        super(res, bitmap);
        bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(
                bitmapWorkerTask);
    }

    public BitmapWorkerTask getBitmapWorkerTask() {
        return bitmapWorkerTaskReference.get();
    }
}

public static boolean cancelPotentialWork(String data, ImageView imageView,
        ProgressBar progressBar) {
    final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(
            imageView, progressBar);

    if (bitmapWorkerTask != null) {
        final String bitmapData = bitmapWorkerTask.data;
        if (bitmapData != data) {
            bitmapWorkerTask.cancel(true);
        } else {
            return false;
        }
    }
    return true;
}

private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView,
        ProgressBar progressBar) {
    if (imageView != null) {
        final Drawable drawable = imageView.getDrawable();
        if (drawable instanceof AsyncDrawable) {
            final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
            return asyncDrawable.getBitmapWorkerTask();
        }
    }
    return null;
}

}