2016-03-07 51 views
1

我有一个自定义的应用程序类与很多实例属性和活动依赖于此属性。有时当活动在后台并且我打开应用程序时,会发生一些空指针异常。我知道这个问题的原因是Android正在杀死该应用程序。当我打开应用程序时,将再次创建当前活动,但现在应用程序属性为空。如何处理Android内存管理和onTrimMemory回调?

我有两个选择来解决这个问题。当级别为TRIM_MEMORY_MODERATE或更高时,两种解决方案均需要使用onTrimMemory方法清除应用程序缓存。

1º - 清除缓存并打开应用程序时,如果所需的应用程序属性为空,则当前活动结束。只有主要活动会再次加载应用程序属性。这需要较少的工作,因为最重构将发生在主要活动中。

2º - 每次应用程序属性为空时,重构所有要从后端加载所有必需数据的活动。在这里我有很多工作,因为所有的活动都必须是独立的,并且必须知道如何加载他自己的数据。

处理此Android行为的最佳方法是什么?你如何解决这个问题?当缓存数据从自定义Application类中清除时,我需要做些什么来防止这个空指针?

回答

0

我不知道很多关于你的数据仓库架构存在,但应遵循以下规则:

  1. TRIM_MEMORY_BACKGROUND - 尝试删除所有的大致所需要的资源,你知道你不会需要重新东西 - 启动活动
  2. TRIM_MEMORY_MODERATE - 你也可以清除可能是由加载器或一些的AsyncTask
  3. TRIM_MEMORY_COMPLETE容易地装载一些活动所需的资源 - 你可能会认为,以清除您的应用类中几乎一切,只保留最低限度 - 所需的数据为您的应用程序启动并正确恢复活动状态。

除上述那些我3还建议您使用TRIM_MEMORY_UI_HIDDEN这意味着你的活动不再是可见的,你可以释放出大量的用户界面相关的资源,尤其是位图缓存:)你的活动中。

+0

我决定使用TRIM_MEMORY_MODERATE,但我需要更多详细信息,说明清除缓存时应该如何处理这些活动。 AsyncTask例如应该放在onResume中?现在,我正在完成没有找到缓存上的属性时的活动。 –

+0

你不应该那样做,你不应该手动完成你的活动,只要它是根据你设计/功能流程的想要的行为。对于大多数情况下应该使用AsyncLoaders来加载所需资源的活动,他们已经为您处理了缓存,并且在活动被销毁时它们将被清除。 –

+0

我现在面临的最大问题是有四个片段(tabLayout)的活动。他们以前已经呈现过。当此活动恢复时,我需要使用实际数据刷新所有视图。该活动的onResume首先被调用并从后端加载基本数据。片段onResume并行运行,因为onResume活动异步加载。片段也从后端加载数据。这在recyclerviews和其他组件中造成了一种奇怪的行为,因为它必须按照第一次加载的顺序运行。 –