如何在列表视图中加载大量项?

17 浏览
0 Comments

如何在列表视图中加载大量项?

我正在开发一个应用程序,需要从服务器下载许多帖子。列表项包含一些文本信息,用户图像和图片被插入到消息中。\n为了更新列表视图,我使用了来自https://github.com/chrisbanes/Android-PullToRefresh的PullToRefreshListView,并使用了http://codehenge.net/blog/2011/06/android-development-tutorial-asynchronous-lazy-loading-and-caching-of-listview-images/中的懒加载和缓存列表视图图片。\n一切运行良好,但我遇到了一个问题:当我滚动列表视图并下载越来越多的项时,会出现内存不足的错误消息。我该如何解决这个问题?

0
0 Comments

问题原因:加载大量项目到ListView中可能会导致内存不足或应用程序崩溃。

解决方法:

1. 尝试只加载可见项目的图像,并在它们变为不可见时立即回收它们。

这样可以循环使用无限的图像。

2. 使用惰性加载(lazy load)创建一个缓存文件夹。您也可以使用它来检索已回收的图像。

下面是一个示例代码,用于实现上述解决方法:

public class MyAdapter extends ArrayAdapter {

private LruCache imageCache;

public MyAdapter(Context context, int resource, List objects) {

super(context, resource, objects);

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

final int cacheSize = maxMemory / 8;

imageCache = new LruCache<>(cacheSize);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view = convertView;

// Inflate the view if it is null

if (view == null) {

LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = inflater.inflate(R.layout.list_item, null);

}

// Get the ImageView

ImageView imageView = (ImageView) view.findViewById(R.id.image_view);

// Get the image URL

String imageUrl = getItem(position);

// Check if the image is already cached

Bitmap cachedImage = imageCache.get(imageUrl);

if (cachedImage != null) {

// If cached, use the cached image

imageView.setImageBitmap(cachedImage);

} else {

// If not cached, load the image asynchronously

ImageLoaderTask task = new ImageLoaderTask(imageView, imageCache);

task.execute(imageUrl);

}

return view;

}

private class ImageLoaderTask extends AsyncTask {

private ImageView imageView;

private LruCache imageCache;

public ImageLoaderTask(ImageView imageView, LruCache imageCache) {

this.imageView = imageView;

this.imageCache = imageCache;

}

@Override

protected Bitmap doInBackground(String... params) {

String imageUrl = params[0];

Bitmap bitmap = null;

// Code to download the image from the URL and create a Bitmap object

// ...

// Cache the downloaded image

imageCache.put(imageUrl, bitmap);

return bitmap;

}

@Override

protected void onPostExecute(Bitmap result) {

if (imageView != null && result != null) {

// Set the image to the ImageView

imageView.setImageBitmap(result);

}

}

}

}

通过实现上述解决方法,您可以在加载大量项目到ListView中时避免内存问题,并且可以实现图像的循环使用和惰性加载。

0
0 Comments

问题的出现的原因:

在Android上使用ListView加载大量项目时,经常会出现内存异常的问题,特别是与图像(尤其是位图)相关的问题。这些问题在stackoverflow上有很多讨论。建议您先浏览现有的问题,看看您的情况是否与已有问题之一相匹配,如果没有,请详细说明您的情况与众不同。

解决方法:

下面是一些解决此问题的示例链接:

- [Out of memory exception due to large bitmap size](https://stackoverflow.com/questions/5321579)

- [Android: out of memory exception in Gallery](https://stackoverflow.com/questions/3238388)

- [Android handling out of memory exception on image processing](https://stackoverflow.com/questions/3724082)

等等,您可以通过以下链接搜索更多相关问题:

[https://stackoverflow.com/search?q=android+out+of+memory+exception+bitmap](https://stackoverflow.com/search?q=android+out+of+memory+exception+bitmap)

请注意,由于篇幅限制,我们无法在此提供具体的解决方法,但通过浏览上述链接,您应该能够找到与您的问题匹配的解决方案。

0