2017-01-10 1 views
0

Я обновил приложение один день назад, и в первый раз, я получил некоторые сбои, размещенные пользователями, как следующему:java.lang.OutOfMemoryError во время прокрутки в ListView андроида

java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:299) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
    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:623) 
    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.loadBitmapFromStream(UrlImageViewHelper.java:109) 
    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.access$100(UrlImageViewHelper.java:27) 
    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$1.onDownloadComplete(UrlImageViewHelper.java:582) 
    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$3.doInBackground(UrlImageViewHelper.java:648) 
    at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$3.doInBackground(UrlImageViewHelper.java:645) 
    at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
    ... 3 more 

Я понимаю что это связано с обработкой изображений. (приложение извлекает много статей с сервера, которые отображаются как изображение и заголовок.)

Одним из быстрых решений, которые я сделал, является уменьшение размера изображений с максимальной шириной 600 пикселей (переменная изображения по размеру).

Для этого я использовал com.koushikdutta.urlimageviewhelper библиотеки, версия 1.0.4. Я не знаю, есть ли другая библиотека, способная обрабатывать большое количество изображений и как ее использовать.

Один из способов, как я использую в ListView, как показано ниже:

public class NewsAdapter extends BaseAdapter { 

    private ArrayList<NewsItem> data; 

    private Context context; 
    private LayoutInflater layoutInflater; 

    public NewsAdapter(Context context, ArrayList<NewsItem> data) { 
     this.data = data; 
     layoutInflater = LayoutInflater.from(context); 
     this.context = context; 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return data.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @SuppressLint({ "DefaultLocale", "InflateParams" }) 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.news_row, null); 
      holder = new ViewHolder(); 

      holder.image = (ImageView) convertView 
        .findViewById(R.id.image); 

      holder.name = (TextView) convertView 
        .findViewById(R.id.time); 

      holder.job = (TextView) convertView 
        .findViewById(R.id.title); 

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


     //change the font 
     Typeface typeFace=Typeface.createFromAsset(context.getAssets(),"fonts/Lato-Regular.ttf"); 

     holder.name.setTypeface(typeFace); 
     holder.job.setTypeface(typeFace); 

     UrlImageViewHelper.setUrlDrawable(holder.image, 
       data.get(position).getImage_url()); 

     holder.name.setText(data.get(position).getDate()); 
     holder.job.setText(data.get(position).getTitle()); 

     return convertView; 
    } 

    static class ViewHolder { 
     ImageView image; 
     TextView name, job; 
    } 
} 
+1

Возможный дубликат [Strange из выпуска памяти во время загрузки изображения на объект Bitmap] (http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-load-an-image-to-a-bitmap-object) –

+1

вы можете попробовать picasso с функцией fit(), ваша ошибка oom не появится здесь, это ссылка ссылки https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact = 8 & вед = 0ahUKEwiZ9LXqmrfRAhVEuY8KHfKIDqsQFggZMAA & URL = HTTP% 3A% 2F% 2Fsquare.github.io% 2Fpicasso% 2F & USG = AFQjCNHtRDFJvt8HPDMbENo3RvpkdPZYsA & Sig2 = GxuKK26D5b7zeIP3m0ewbA & BVM = bv.143423383, d.c2I – pkgrover

+0

код Plaese – Sebastian

ответ

1

Я думаю, что у вас есть проблемы декодировать поток в растровое изображение, если есть много потоков, чтобы преобразовать в растровые изображения, то есть высокая вероятность того, чтобы выбросить памяти.

Если у вас есть библиотека. попробуйте еще

Nostra

Glide

Picasso

+0

Я пробовал с Picasso, но все же он дает мне OutOfMemory Issues. – Xhulio

+1

@ Xhulio, вы также можете попробовать отдых двух. Если проблема по-прежнему сохраняется, вы должны уменьшить размер изображений с сервера. Я думаю, вы должны уменьшить масштабы, чтобы преодолеть эту проблему. –

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

  • Нет связанных вопросов^_^