凌空位图图像为null [英] Volley image bitmap is null

查看:212
本文介绍了凌空位图图像为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用我使用抽射ImageLoader的,但有一个问题,有我无法理解。
当我打电话只和response.getBitmap设置为背景的ImageView它的罚款,但是当我加入一些code为例的System.out.println(response.getBitmap)崩溃。在如果我叫respone.getBitmap只有一次它的确定一个词,但是当两次或更多次崩溃。这里有什么问题吗?

 公共类NewsAdapter延伸BaseAdapter {
    私人的ArrayList<新闻> mNewsList;
    私人DefaultActivity mActivity;
    私人ImageLoader的ImageLoader的;
    私人请求队列mRequestQueue;    公共NewsAdapter(DefaultActivity pActivity,ArrayList的<新闻>新闻列表){
        mActivity = pActivity;
        mNewsList =新闻列表;
        mRequestQueue = Volley.newRequestQueue(mActivity);
        ImageLoader的=新ImageLoader的(mRequestQueue,新BitmapLruCache(
                BitmapLruCache.getDefaultLruCacheSize()));    }    私有类ViewHolder {
        公共ImageView的networkImageView;
        公众的TextView称号;
        公共TextView的描述;
    }    @覆盖
    公众诠释的getCount(){
        返回mNewsList.size();
    }    @覆盖
    公共新闻的getItem(int i)以{
        返回mNewsList.get(ⅰ);
    }    @覆盖
    众长getItemId(int i)以{
        返回0;
    }    @覆盖
    公共查看getView(INT I,观景,ViewGroup中的ViewGroup){
        最后ViewHolder viewHolder;
        最后新闻新闻=的getItem(I)        如果(查看== NULL){
            最后LayoutInflater李=(LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            鉴于= li.inflate(R.layout.orange_news_item,ViewGroup中,FALSE);
            viewHolder =新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);
        }其他{
            viewHolder =(ViewHolder)view.getTag();
        }
        viewHolder.title.setText(Html.fromHtml(news.getTitle()));
        viewHolder.description.setText(Html.fromHtml(news.getBody()));
        imageLoader.get(news.getImageThumbUrl(),新ImageLoader.ImageListener(){
            @覆盖
            公共无效onResponse(ImageLoader.ImageContainer响应,布尔isImmediate){
                    viewHolder.networkImageView.setImageBitmap(response.getBitmap());
                    的System.out.println(位图=+ response.getBitmap());
                    的System.out.println(宽度=+ response.getBitmap()的getWidth());
                    的System.out.println(高度=+ response.getBitmap()的getHeight());
            }            @覆盖
            公共无效onErrorResponse(VolleyError错误){
                //使用文件来更改的实现的方法体|设置|文件模板。
            }
        });
        返回视图。
      }}


解决方案

作为除了validcat的回答是:

onResponse()为您提供了一个即时响应一个空的位图时,它开始获取图像,如果图像是不是在ImageLoader的缓存。以后,如果一切正常的话,它被再次调用,这一次与一个非空的位图。

这允许您设置一个载入画面或进度条,而图像加载时( onResponse()可提供即时空),并设置在屏幕上获取图像在收到时( onResponse()给出了一个非空的位图)。

In my application I am using volley imageLoader but there is one issue there I couldn't understand. When I am calling only response.getBitmap and set it as background imageview it's fine, but when I add some code for example System.out.println(response.getBitmap) it crashes. In one word if I call respone.getBitmap only once it's ok, but when twice or more it crashes. What is the problem here?

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;
      }

}

解决方案

As an addition to validcat's answer:

onResponse() gives you a null bitmap with an immediate response when it starts to fetch the image and if the image is not in the ImageLoader cache. Later, if everything goes ok, it is invoked again, this time with a non null bitmap.

This allows you to setup a loading screen or progress bar while the image is loading (when onResponse() gives an immediate null) and set the fetched image on the screen when it is received (onResponse() gives a non null bitmap).

这篇关于凌空位图图像为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆