Android 如何在回收了ImageView的可绘制视图后重新使用它?
我有很多图像的gridview,我可以在这个gridview中显示不同的图像组,这些图像可以通过按一些按钮进行更改。为了防止使用大量内存,我在更改图像组后回收所有下载的图像。类似这样的内容:Android 如何在回收了ImageView的可绘制视图后重新使用它?,android,Android,我有很多图像的gridview,我可以在这个gridview中显示不同的图像组,这些图像可以通过按一些按钮进行更改。为了防止使用大量内存,我在更改图像组后回收所有下载的图像。类似这样的内容: 我的适配器为视图加载图像,并将它们传输到视图中。更改图像组后,我调用方法recycleImages()来回收所有保存的图像 public class DataArrayAdapter<T extends View & DataListViewItem> extends ArrayAdap
我的适配器为视图加载图像,并将它们传输到视图中。更改图像组后,我调用方法recycleImages()来回收所有保存的图像
public class DataArrayAdapter<T extends View & DataListViewItem> extends ArrayAdapter<DataObject>
{
//Loaded images. Key - position, value - image
private SparseArray<Drawable> mImages;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
T view = (T) convertView;
if (view == null) {
view = createView(position);
} else {
//reuse view by transfering new data to it
view.updateListViewItem(getItem(position));
}
checkViewImage(view, position);
return view;
}
protected void checkViewImage(T view, int position) {
if (view.needImage()) {
if (mImages == null) {
mImages = new SparseArray<Drawable>();
}
Drawable image = mImages.get(position);
if (image == null) {
String imageUrl = getItem(position).getUrl();
if (imageUrl != null) {
//download image and put it to view after download
ImageRequest imageRequest = new ImageRequest(imageUrl, view);
imageRequest.send();
}
} else {
view.setImageDrawable(image);
}
}
}
public void recycleImages() {
if (mImages != null) {
Drawable drawable;
for (int i = 0, l = mImages.size(); i < l; ++i) {
drawable = mImages.valueAt(i);
if (drawable instanceof BitmapDrawable) {
((BitmapDrawable) drawable).getBitmap().recycle();
}
}
mImages.clear();
}
}
}
加载所有图像后,会对所有创建的ViewHolder对象调用方法combine,以便在一瞬间绘制所有图像下载图像时是否尝试使用占位符位图而不是null?不幸的是,这对我没有帮助。你能共享你的
图像请求
代码吗?我的问题已编辑完毕
protected void onPostExecute(Drawable image) {
mHolders.add(new ViewHolder(mView, image));
checkLoaders();
}
private class ViewHolder {
private T mView;
private Drawable mImage;
public ViewHolder(T view, Drawable image) {
mView = view;
mImage = image;
}
public void combine() {
if (mView != null) {
mView.setImageDrawable(mImage);
mView = null;
mImage = null;
}
}
}