Android 当用户滚动时,Listview项将从内存中删除位图

Android 当用户滚动时,Listview项将从内存中删除位图,android,listview,Android,Listview,我正在开发一个android应用程序。我有一个包含列表视图的活动 列表视图有很多项,每个项都包含一个位图图像 由于列表非常大,包含大量图像,因此在加载位图时,在一些旧设备上会出现内存不足错误 因此,我正在寻找一种对旧设备执行以下操作的方法: 加载视图中(或视图附近)项目的位图 当用户向下滚动时,我加载他应该看到的位图,并删除现在隐藏的位图 因此,在任何时候,只有视图中(或视图附近)的图像才会加载到堆中,而其他图像不再在视图中时会被删除 有办法吗 其他信息: 我遵循了关于如何高效加载位图图像的

我正在开发一个android应用程序。我有一个包含列表视图的活动

列表视图有很多项,每个项都包含一个位图图像

由于列表非常大,包含大量图像,因此在加载位图时,在一些旧设备上会出现内存不足错误

因此,我正在寻找一种对旧设备执行以下操作的方法:

  • 加载视图中(或视图附近)项目的位图
  • 当用户向下滚动时,我加载他应该看到的位图,并删除现在隐藏的位图
  • 因此,在任何时候,只有视图中(或视图附近)的图像才会加载到堆中,而其他图像不再在视图中时会被删除
有办法吗

其他信息:

我遵循了关于如何高效加载位图图像的所有说明和代码(在android文档和我能找到的任何网站上),我还确保没有内存泄漏,我回收每个位图并确保GC正常工作,最后,在旧设备上,我使图像的分辨率尽可能最小。但是列表的大小导致内存不足仍然出现在某些设备上

因此,我想知道我是否可以做上述建议的解决方案


非常感谢您的帮助

您想搜索一些教程和“延迟加载”示例。

一个可能的例子是:

你应该考虑从谷歌I/O 2012查看样例库应用程序。您需要的一切都在那里实现

源代码在上提供,这是构建图库的唯一示例。你也应该看看RoMunGy的(开始),他用“代码> ListVIEW/CODE >解释性能问题,并教你如何高效地使用适配器。(ViewHolder模式和重用视图)

下面是GridView的RecycleListener(可从API级别1获得)。每当在RecycleBin的废料堆中放置视图时,RecyclerListener用于接收通知。此侦听器用于释放与放置在RecycleBin中的视图关联的资源

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.album);

    mAdapter = new PhotoAdapter(this);

    mGridView = (GridView) findViewById(android.R.id.list);
    mGridView.setAdapter(mAdapter);

    mGridView.setRecyclerListener(new RecyclerListener() {
        @Override
        public void onMovedToScrapHeap(View view) {
            // Release strong reference when a view is recycled
            final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon);
            imageView.setImageBitmap(null);
        }
    });

    // Kick off loader for Cursor with list of photos
    getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks);
}
使用类似的库可以为您提供缓存图像和内存管理的选项。您应该能够通过它设置最大缓存大小,并且它还负责在后台线程上加载图像


ListView负责回收您放入图像的视图,并在这方面简化内存。

我可能会误解这一点,但延迟加载不只是为了加载图像,而不是删除已加载的图像吗?这取决于实现。也许默认情况下惰性加载是您描述它的方式,但我知道事实上提供的示例并非如此。您可以在UI模式应用程序中看到它(以及许多其他伟大的库):您是否尝试过实现视图持有者模式?