Растровое изображение изображения волейбола

В моем приложении я использую 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; } } 

В дополнение к ответу validcat:

onResponse() дает вам нулевое растровое изображение с немедленным ответом, когда он начинает извлекать изображение, и если изображение отсутствует в кеше ImageLoader. Позже, если все идет нормально, оно вызывается снова, на этот раз с неточечным растровым изображением.

Это позволяет вам настроить экран загрузки или индикатор выполнения при загрузке изображения (когда onResponse() дает немедленный нуль) и установить выбранное изображение на экране при его получении ( onResponse() дает onResponse() ).

Я даю несколько советов, и вы можете проверить свой код:

  • Когда onResponse , проверьте onResponse на 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); } } 

Если проблема все еще здесь, добавьте дополнительную информацию.