凌空位图图像为null位图、图像、null

由网友(成熟羙")分享简介:在我的应用我使用抽射ImageLoader的,但有一个问题,有我无法理解。当我打电话只和response.getBitmap设置为背景的ImageView它的罚款,但是当我加入一些code为例的System.out.println(response.getBitmap)崩溃。在如果我叫respone.getBitmap...

在我的应用我使用抽射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).

阅读全文

相关推荐

最新文章