Мое приложение содержит listview с 2 текстовыми изображениями и изображениями, загруженными с json, я нашел в Интернете класс для ImageDownload, но теперь, когда я запускаю приложение, он загружает элементы, но прокрутка медленная, а глюковая и закрывающая Во-вторых, когда я прокручиваю вниз и вернусь наверх, изображения снова загружаются. И я обнаружил, что проблема не в памяти, и я должен масштабировать растровое изображение. Но я не понимаю, как работает, и я не могу этого сделать.Изображения в Listview из памяти
ImageDownloadTask
public class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
FeedItem feed;
BitmapFactory bm;
private final WeakReference<ImageView> imageViewReference;
public ImageDownloaderTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
// Actual download method, run in the task thread
protected Bitmap doInBackground(String... params) {
// params comes from the execute() call: params[0] is the url.
return downloadBitmap(params[0]);
}
@Override
// Once the image is downloaded, associates it to the imageView
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
// Get current dimensions
int width = bitmap.getWidth();
int height = bitmap.getHeight();
// Determine how much to scale: the dimension requiring
// less scaling is.
// closer to the its side. This way the image always
// stays inside your.
// bounding box AND either x/y axis touches it.
float xScale = ((float) width)/width;
float yScale = ((float) height)/height;
float scale = (xScale <= yScale) ? xScale : yScale;
// Create a matrix for the scaling and add the scaling data
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
// Create a new bitmap and convert it to a format understood
// by the
// ImageView
Bitmap scaledBitmap = Bitmap.
createBitmap(bitmap, 0, 0, width, height,
matrix, true);
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
if (imageView != null) {
if (bitmap != null) {
imageView.setImageBitmap(scaledBitmap);
} else {
imageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.list_placeholder));
}
}
}
}
static Bitmap downloadBitmap(String url) {
if(URLUtil.isValidUrl(url)){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inScaled = false;
options.inPurgeable = true;
options.inInputShareable = true;
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
final HttpGet getRequest = new HttpGet(url);
try {
HttpResponse response = client.execute(getRequest);
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w("ImageDownloader", "Error " + statusCode
+ " while retrieving bitmap from " + url);
return null;
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = null;
try {
inputStream = entity.getContent();
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);
} finally {
if (client != null) {
client.close();
}
}
return null;
}
return null;
}
}
Ошибка
threadid=14: thread exiting with uncaught exception (group=0x4182b2a0)
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.OutOfMemoryError
Спасибо Ларри, у меня были проблемы с приложением к библиотеке, но я добился успеха и сделал его работу. Никакой силы близко :) Еще раз спасибо –