【问题标题】:The concept of memory handling in case of infinite List无限List情况下内存处理的概念
【发布时间】:2017-03-30 10:40:21
【问题描述】:

我正在考虑使用无限列表(Recyclerview 或 Listview)和 ArrayList 提供的数据。 (对象——一个模型类)

所以对于无限列表,Arraylist 的大小会增加,因此列表占用的内存也会增加。那么应用程序将如何运行,它会不会创建内存不足异常或不会挂起。

我只是想知道对此有效的概念,以及它是否会产生异常——让我知道我们该如何处理。

【问题讨论】:

  • 准确地说,在ArrayList的情况下无限意味着Integer.MAX_VALUE - 8
  • 如果您使用没有限制的集合(参见 Blackbeld 评论),由于内存是有限的,因此无限将始终导致 OutOfMemoryError。您将需要清除一些未使用/看不见的值。

标签: android listview arraylist android-recyclerview


【解决方案1】:

你的应用很可能会抛出OOM异常,处理方式如下:

try {
    // fill your infinite list as you want
} catch (OutOfMemoryError E) {
    //release some/all objects from your list, f.e., the first 100 ones or so
}

希望对你有帮助。

【讨论】:

  • 这可能还不够,因为这可能会导致其他错误。 Error 不会被抓到
  • 足够了,相信我,而且很容易尝试,创建一个任意类型的ArrayList并在一段时间内添加它的值(true)
  • 是的,在这样一个简单的程序中。此应用程序的其他线程可能会受到影响,因为它们将共享内存。所以很多东西可能会崩溃。切勿尝试从错误中恢复(某些情况下除外)。 Some reading
【解决方案2】:

在尝试将其加载到回收站视图中之前,请检查列表占用的内存是否小于可用内存。因此,处理 OutOfMemoryException 最有效的方法是构建应用程序,使其永远不会尝试将大量数据加载到内存中以避免异常。

我不知道您正在使用的列表中的项目超过 500 或 1000。所以您不必担心,因为它会在您的内存缓存中。但实际问题发生在您在回收站视图中加载图像时,您需要不断回收您的视图。

同样在应用程序类中,当你没有足够的内存时你会得到回调

@Override
public void onLowMemory() {
    super.onLowMemory();
}

如果您还有任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多