我想区分配置更改,例如:屏幕旋转时与用户更改系统区域设置时的比较。
就我而言,我通过API获得了一些与语言环境相关的数据;当屏幕旋转时,我不想再次打电话,但是我确实希望在场地变化时这样做。
我猜有" hacky"这样做的方法,如在侦听区域设置更改,保存以前的区域设置等,但我正在寻找更清洁的东西。
人们如何在配置更改方面处理这样的缓存情况?
答案 0 :(得分:0)
事实上,这恰好是“与语言环境相关的数据”与此问题没有多大关系。如果它是与语言环境无关的数据,则在配置更改后您不一定要再次进行调用。
所以,你应该像处理一般情况一样处理你的情况。两个主要标准是:
数据是否需要在流程终止后继续存在?如果是,则需要保留数据(数据库,SharedPreferences
或其他类型的文件),可能还有内存缓存以进行优化。如果不是,内存缓存就足够了。
数据有多大?如果它是字节数(相对于KB / MB),则可以将其作为内存缓存放在已保存的实例状态Bundle
中。如果不是,请使用一些具有适当LRU样式上限的进程级高速缓存(例如,static
单例数据管理器)作为内存高速缓存。即使在这种情况下,您也可以在保存的实例状态Bundle
中放置一些标识数据,以帮助您了解从内存缓存或磁盘重新加载的内容(如果进程终止)。
然后,在配置更改中,在相应的生命周期方法中,查看是否有针对当前区域设置缓存的数据(无论是不同的区域设置还是同一区域设置不再重要)。如果您没有当前语言环境的缓存数据,请加载它。
答案 1 :(得分:0)
如果要阻止某些配置更改,可以修改configChanges属性。一旦你将它设置为仅重新加载你想要的配置类型,我建议存储一个静态引用configuration的属性。
例如:
public void onCreate(Bundle savedInstanceState) {
currentOrientation = getResources().getConfiguration().orientation;
}
public void onConfigurationChanged(Configuration newConfig) {
if (currentOrientation != newConfig.orientation) {
// orientation change
}
currentOrientation = newConfig.orientation;
}