如何处理Android内存管理和远程回调?

如何处理Android内存管理和远程回调?,android,memory-management,android-memory,Android,Memory Management,Android Memory,我有一个自定义的应用程序类,它有很多实例属性,活动依赖于这些属性。有时,当活动在后台,我打开应用程序时,会发生一些空指针异常。我知道这个问题的原因是Android正在扼杀这个应用。当我打开应用程序时,会再次创建当前活动,但现在应用程序属性为空 对于如何解决这个问题,我有两种选择。这两种解决方案都要求在级别为TRIM\u MEMORY\u Middle或更高时使用OnTrimmery方法清除应用程序缓存 1º-清除缓存并打开应用程序时,如果所需的应用程序属性为空,则当前活动结束。只有主活动将再次加

我有一个自定义的应用程序类,它有很多实例属性,活动依赖于这些属性。有时,当活动在后台,我打开应用程序时,会发生一些空指针异常。我知道这个问题的原因是Android正在扼杀这个应用。当我打开应用程序时,会再次创建当前活动,但现在应用程序属性为空

对于如何解决这个问题,我有两种选择。这两种解决方案都要求在级别为TRIM\u MEMORY\u Middle或更高时使用OnTrimmery方法清除应用程序缓存

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

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


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

我不太了解您的数据存储库体系结构,但您应该遵循以下规则:

  • 修剪记忆背景-试着删除所有大致需要的资源,你知道你不需要重新开始你的活动的东西
  • TRIM_MEMORY_MODERATE-您还可以清除一些活动所需的资源,这些资源可以通过加载程序或异步任务轻松加载
  • TRIM_MEMORY_COMPLETE-您可能认为可以清除应用程序类中的几乎所有内容,只保留应用程序启动和正确恢复活动状态所需的最少数据

  • 除上述3项外,我还建议您使用TRIM_MEMORY_UI_HIDDEN,这意味着您的活动不再可见,您可以释放缓存在活动中的大型UI相关资源,特别是位图:)。

    我对您的数据存储库体系结构了解不多,但您应该遵循以下规则:

  • 修剪记忆背景-试着删除所有大致需要的资源,你知道你不需要重新开始你的活动的东西
  • TRIM_MEMORY_MODERATE-您还可以清除一些活动所需的资源,这些资源可以通过加载程序或异步任务轻松加载
  • TRIM_MEMORY_COMPLETE-您可能认为可以清除应用程序类中的几乎所有内容,只保留应用程序启动和正确恢复活动状态所需的最少数据

  • 除上述3项外,我还建议您使用TRIM_MEMORY_UI_HIDDEN,这意味着您的活动不再可见,您可以释放缓存在活动中的大型UI相关资源,特别是位图:)。

    我决定使用TRIM_MEMORY_Medium,但我需要更多关于清除缓存时活动应如何运行的详细信息。例如,AsyncTask应该放在onResume中?目前,我正在完成缓存中未找到属性时的活动。您不应该这样做,只有在符合您的设计/功能流程的需要时,才不应该手动完成活动。对于大多数情况下都应该使用AsyncLoader加载所需资源的活动,它们已经为您处理缓存,当活动被销毁时,它们将被清除。我现在遇到的最大问题是一个包含四个片段的活动(tabLayout)。它们以前已经渲染过了。恢复此活动后,我需要使用实际数据刷新所有视图。首先调用活动的onResume并从后端加载基本数据。onResume上的片段并行运行,因为活动onResume异步加载内容。片段也从后端加载数据。这在recyclerviews和其他组件中导致了一种奇怪的行为,因为它必须像第一次加载时一样按顺序运行。我将为每个片段添加/创建一个AsyncLoader,并单独处理每个片段上的数据加载,而不是将其加载到活动中。这是最好的直截了当的解决方案:或者如果你想要新的MVP方式,您可以为每个演示者使用RxJava来获取数据,或者如果您不想使用RxJava,您可以开始构建本地中央存储库类,并使用EventBus将数据事件发送回演示者。我决定使用TRIM_MEMORY_MODERATE,但我需要更多关于清除缓存时活动应如何运行的详细信息。例如,AsyncTask应该放在onResume中?目前,我正在完成缓存中未找到属性时的活动。您不应该这样做,只有在符合您的设计/功能流程的需要时,才不应该手动完成活动。对于大多数情况下都应该使用AsyncLoader加载所需资源的活动,它们已经为您处理缓存,当活动被销毁时,它们将被清除。我现在遇到的最大问题是一个包含四个片段的活动(tabLayout)。它们以前已经渲染过了。恢复此活动后,我需要使用实际数据刷新所有视图。首先调用活动的onResume并从后端加载基本数据。onResume上的片段并行运行,因为活动onResume异步加载内容。片段也从后端加载数据。这在recyclerviews和其他组件中导致了一种奇怪的行为,因为它必须像第一次加载时一样按顺序运行。我将为每个片段添加/创建一个AsyncLoader,并分别处理每个片段和组件上的数据加载