android - Listview 中的图像内存不足

标签 android listview android-asynctask

我的应用程序包含带有 2 个 TextView 和从 json 下载的 ImageView 的 ListView ,我在 ImageDownload 的互联网类(class)上找到了但是现在当我启动应用程序时它会加载项目,但是滚动很慢并且有错误并且强制关闭。第二件事是当我向下滚动并返回顶部,再次重新加载图像。而且我发现问题是内存不足,我必须缩小位图。但我不明白真正的工作原理,我做不到。

图片下载任务

 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

最佳答案

因此,您在执行此操作时会遇到一些您最初不会想到的事情,因此我建议使用由已经弄明白的人构建的库。尝试 picasso !

关于android - Listview 中的图像内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21056329/

相关文章:

android - 通过代码更改 TabLayout 中的选项卡,有一个障碍

android - HTML5 录音在 Google Nexus 中不起作用

javascript - 使用 jquery mobile 的动态 ListView

java - 如何从 ViewPager 的 onPageSelected 异步任务到 fragment ?

android - App 终止时异步任务停止(调用 onDestroyed)

安卓。 fragment getActivity() 有时返回 null

Android Canvas 改变一些像素颜色

Android Ble 扫描回调未连续触发

android - ListView 抛出 NoSuchElementException

json - 使用 Rest Api 的 Xamarin 中的 ListView