简体   繁体   English

Android ListView ImageDownloadTask崩溃

[英]Android listview ImageDownloadTask crashes

My app contains listview with 2 textviews and imageview downloaded from json, i have found on internet class for ImageDownload but now when i start app it loads the items, but scrolling is slow and buggy and force closes.Second thing is when i scroll down and turn back on top, images being reloaded again. 我的应用程序包含从json下载的具有2个textviews和imageview的listview,我已经在Internet类上找到了ImageDownload,但是现在当我启动应用程序时它加载了项目,但是滚动缓慢且有错误并且强制关闭。第二件事是当我向下滚动并回到顶部,图像将重新加载。 How could be a problem? 怎么可能有问题呢? I am new to Android 我是Android新手

This is in Adapter Class 这在适配器类中

public View getView(int position, View convertView, ViewGroup parent) {
 ViewHolder holder;
 if (convertView == null) {
 convertView = layoutInflater.inflate(R.layout.list_row_layout, null);

  holder = new ViewHolder();
  holder.headlineView = (TextView)convertView.findViewById(R.id.title);
  holder.reportedDateView = (TextView) convertView.findViewById(R.id.date);
  holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage);

     convertView.setTag(holder);
    } else {
       holder = (ViewHolder) convertView.getTag();
       }

     FeedItem newsItem = (FeedItem) listData.get(position);
     holder.headlineView.setText(Html.fromHtml(newsItem.getTitle()));
     holder.reportedDateView.setText(Html.fromHtml(newsItem.getContent()));

      if (holder.imageView != null) {

      new ImageDownloaderTask(holder.imageView).execute(newsItem.getAttachmentUrl());
                }
return convertView;

the ImageDownloaderTask class ImageDownloaderTask类

  public class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    FeedItem feed;
        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;
                }

      if (imageViewReference != null) {
      ImageView imageView = imageViewReference.get();
     if (imageView != null) {

      if (bitmap != null) {
     imageView.setImageBitmap(bitmap);
    } else {
imageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.list_placeholder));
                                }
                        }

                }
        }

        static Bitmap downloadBitmap(String url) {
                if(URLUtil.isValidUrl(url)){

             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; 返回null; } }

}

the logCat logCat

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
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:722)
at com.example.example.asynctaask.ImageDownloaderTask.downloadBitmap(ImageDownloaderTask.java:78)
at com.example.example.asynctaask.ImageDownloaderTask.doInBackground(ImageDownloaderTask.java:35)
at com.example.example.asynctaask.ImageDownloaderTask.doInBackground(ImageDownloaderTask.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)

Look in logcat: Caused by: java.lang.OutOfMemoryError it means your app out of memory :) 在logcat中查找: 原因:java.lang.OutOfMemoryError,这意味着您的应用程序内存不足:)

I think this solve you problem: 我认为这可以解决您的问题:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

https://developer.android.com/training/displaying-bitmaps/manage-memory.html https://developer.android.com/training/displaying-bitmaps/manage-memory.html

Also you can search similar questions, like: Bitmap Image out of memory 您也可以搜索类似的问题,例如: 位图内存不足

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM