0

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. How could be a problem? I am new to 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

  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; }

}

the 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)
  • 2
    `Caused by: java.lang.OutOfMemoryError`. scale down the bitmap.http://stackoverflow.com/questions/16765899/out-of-memory-error-with-bitmap. Consider lazy loading. http://stackoverflow.com/questions/16789676/caching-images-and-displaying – Raghunandan Jan 10 '14 at 15:14
  • I am reading at this links, but i dont understand very well how to add it, can you help me out? – Sandra Mladenovic Jan 10 '14 at 15:19
  • Maybe also look at this to help with memory as well http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – w9jds Jan 10 '14 at 15:20
  • there is a example @ http://developer.android.com/training/displaying-bitmaps/load-bitmap.html. for gridview. should not be too hard to implement the same with listview – Raghunandan Jan 10 '14 at 15:21

1 Answers1

0

Look in logcat: Caused by: java.lang.OutOfMemoryError it means your app out of memory :)

I think this solve you problem:

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

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

Also you can search similar questions, like: Bitmap Image out of memory

Community
  • 1
  • 1
artemiygrn
  • 1,036
  • 7
  • 18