2014-01-10 4 views
1

Мое приложение содержит 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 

ответ

1

Таким образом, вы будете сталкиваться несколько вещей, которые вы не сначала думать о том, когда делать это, так что я рекомендую использовать библиотеку, которая была построена людьми, которые уже должен был понять это. Попробуйте picasso!

+0

Спасибо Ларри, у меня были проблемы с приложением к библиотеке, но я добился успеха и сделал его работу. Никакой силы близко :) Еще раз спасибо –

1

This is a little old, но он все равно поможет показать, что «неправильно с вашим подходом».

Также this SO tread goes over all the different approaches.

Наконец, позвольте мне сильно рекомендует Google's REST library called Volley

EDIT Я только что нашел this too, который сравнивает за и против нескольких библиотек REST, в том числе и okHTTP Volley.

Смежные вопросы