java.lang.OutOfMemoryError 在 ListView 滚动期间 android
java.lang.OutOfMemoryError during scrolling of ListView android
一天前我更新了应用程序,第一次收到用户发布的一些崩溃,如下所示:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.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.access0(UrlImageViewHelper.java:27)
at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.onDownloadComplete(UrlImageViewHelper.java:582)
at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.doInBackground(UrlImageViewHelper.java:648)
at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.doInBackground(UrlImageViewHelper.java:645)
at android.os.AsyncTask.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;
}
}
一天前我更新了应用程序,第一次收到用户发布的一些崩溃,如下所示:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.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.access0(UrlImageViewHelper.java:27)
at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.onDownloadComplete(UrlImageViewHelper.java:582)
at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.doInBackground(UrlImageViewHelper.java:648)
at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper.doInBackground(UrlImageViewHelper.java:645)
at android.os.AsyncTask.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;
}
}