5

在我的应用程序中,我使用的是 volley imageLoader,但有一个问题我无法理解。当我只调用 response.getBitmap 并将其设置为背景图像视图时它很好,但是当我添加一些代码例如 System.out.println(response.getBitmap) 时它会崩溃。总之,如果我只调用一次 respone.getBitmap 就可以了,但是当两次或更多时它会崩溃。这里有什么问题?

public class NewsAdapter extends BaseAdapter {
    private ArrayList<News> mNewsList;
    private DefaultActivity mActivity;
    private ImageLoader imageLoader;
    private RequestQueue mRequestQueue;

    public NewsAdapter(DefaultActivity pActivity, ArrayList<News> newsList){
        mActivity = pActivity;
        mNewsList = newsList;
        mRequestQueue = Volley.newRequestQueue(mActivity);
        imageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(
                BitmapLruCache.getDefaultLruCacheSize()));

    }

    private class ViewHolder {
        public ImageView networkImageView;
        public TextView title;
        public TextView description;
    }

    @Override
    public int getCount() {
        return mNewsList.size();
    }

    @Override
    public News getItem(int i) {
        return mNewsList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        final ViewHolder viewHolder;
        final News news = getItem(i);

        if (view == null){
            final LayoutInflater li = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = li.inflate(R.layout.orange_news_item, viewGroup, false);
            viewHolder = new ViewHolder();
            viewHolder.networkImageView = (ImageView)view.findViewById(R.id.imageView);
            viewHolder.title = (TextView)view.findViewById(R.id.title);
            viewHolder.description = (TextView)view.findViewById(R.id.description);

            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.title.setText(Html.fromHtml(news.getTitle()));
        viewHolder.description.setText(Html.fromHtml(news.getBody()));
        imageLoader.get(news.getImageThumbUrl(),new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                    viewHolder.networkImageView.setImageBitmap(response.getBitmap());
                    System.out.println("bitmap="+response.getBitmap());
                    System.out.println("width="+response.getBitmap().getWidth());
                    System.out.println("height="+response.getBitmap().getHeight());
            }

            @Override
            public void onErrorResponse(VolleyError error) {
                //To change body of implemented methods use File | Settings | File Templates.
            }
        });


        return view;
      }

}
4

2 回答 2

8

作为validcat答案的补充:

onResponse()当它开始获取图像并且图像不在 ImageLoader 缓存中时,它会为您提供一个立即响应的空位图。稍后,如果一切正常,则再次调用它,这次使用非空位图。

这允许您在图像加载时设置加载屏幕或进度条(当onResponse()给出立即空值时)并在接收到图像时在屏幕上设置获取的图像(onResponse()给出非空位图)。

于 2015-02-17T02:33:43.453 回答
3

我给出了一些建议,您可以检查您的代码:

  • 一旦onResponse被调用,检查位图 a null,因为它可以null

    Bitmap bitmap = response.getBitmap();
    if (bitmap != null) {
         //TODO other code is here 
    }
    
  • 您也可以通过添加来激活缓存new BitmapLruCache()

    RequestQueue mRequestQueue = Volley.newRequestQueue(this);
    imageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
    

你可以在这里BitmapLruCache实现。

  • new BitmapLruCache()您可以检查(调试或记录)位图是如何存储的以及如何从缓存中检索它们

    @Override
    public Bitmap getBitmap(String url) {
        return get(url); //debug or log
    }
    
    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        if (bitmap != null) {
            put(url, bitmap);
        } 
    }
    

如果问题仍然存在,请添加更多信息。

于 2013-10-17T13:46:32.337 回答