我不确定如何回收位图。
我有一个在列表视图中显示大量项目的应用程序。问题是如果我不降低 ImageDownloader 类中图像的质量,应用程序就会崩溃。
在下面提供的代码中,如果我更改 options.inSampleSize = 4,图像质量会降低,并且应用程序不会耗尽内存。但是,我想使用高质量的图像而不会使我的应用程序崩溃。
我怎么做?
我的 ImageDownloader 的一部分:
static Bitmap downloadBitmap(String url) {
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient client = new DefaultHttpClient(params);
final HttpGet getRequest = new HttpGet(url);
try {
HttpResponse response = client.execute(getRequest);
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
String[] urlBits = url.split("/");
Bitmap bitmap = MiscHelpers.getBitmapFromAsset(context, "animals/" + urlBits[urlBits.length-2] + ".jpg");
Log.w("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url);
return bitmap;
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = null;
try {
inputStream = entity.getContent();
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 1;
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream,null,options);
//final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
} finally {
if (inputStream != null) {
inputStream.close();
}
entity.consumeContent();
}
}
} catch (Exception e) {
// Could provide a more explicit error message for IOException or IllegalStateException
getRequest.abort();
Log.w("ImageDownloader", "Error while retrieving bitmap from " + url + e.toString());
} finally {
if (client != null) {
//client.close();
}
}
return null;
}
我的 ListView 适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Inflate the layout
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.list_single, parent, false);
ImageView image = (ImageView) rowView.findViewById(R.id.picture);
TextView firstline = (TextView) rowView.findViewById(R.id.firstline);
TextView secondline = (TextView) rowView.findViewById(R.id.secondline);
// Get information about the report
AnimalLocationLog current = objects.get(position);
// Get all the important information
String species = current.getSpecies();
String sanitizedSpecies = MiscHelpers.sanitizeString(species);
int reportId = objects.get(position).getTrackerId();
// Construct the URL to the image
String imageLocation = websiteUrl + sanitizedSpecies + separator + reportId + extension;
// Display user report
downloader.download(imageLocation, image);
firstline.setText(species);
secondline.setText("Spotted " + current.getDateTime().toString("yyyy-MM-dd H:m"));
urlToPath = downloader.getUrlToPath();
return rowView;
}