pmb*_*pmb 5 android android-volley
在我的应用程序中,我使用的是volley imageLoader,但有一个问题我无法理解.当我只调用response.getBitmap并将其设置为背景imageview时,它很好,但是当我添加一些代码,例如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;
}
}
Run Code Online (Sandbox Code Playgroud)
作为validcat答案的补充:
onResponse()在开始获取图像时以及图像不在ImageLoader缓存中时,会为您提供一个带有立即响应的空位图.稍后,如果一切正常,则再次调用它,这次使用非null位图.
这允许您在加载图像时设置加载屏幕或进度条(当onResponse()给出立即空值时)并在接收到图像时在屏幕上设置提取的图像(onResponse()给出非空位图).
我给了一些建议,你可以检查你的代码:
一旦onResponse被调用,检查位图中的 a null,因为它可以是null
Bitmap bitmap = response.getBitmap();
if (bitmap != null) {
//TODO other code is here
}
Run Code Online (Sandbox Code Playgroud)您也可以通过添加来激活缓存new BitmapLruCache()
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
imageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
Run Code Online (Sandbox Code Playgroud)你可以在这里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);
}
}
Run Code Online (Sandbox Code Playgroud)如果问题仍然存在,请添加更多信息。
| 归档时间: |
|
| 查看次数: |
3887 次 |
| 最近记录: |