我正在从Web加载数据并将其存储在ViewModel中。因此,当设备的方向改变时,数据将被保留,而我不必从网上重新加载。但是,如果该应用程序进入非活动状态(由于其他应用程序需要内存),则ViewModel内部的数据将被删除,并且在恢复活动/碎片时我将需要重新加载它。当然,可以通过在onSaveInstanceState()
方法中保存一些标志并在重新创建活动/片段时在savedInstanceState
包中找到标志的情况下从Web重新加载数据来避免此问题。但是,这并没有区分从静止状态返回和简单的方向更改。因此,每次我打开设备时,都会不必要地从服务器重新加载数据。
是否有办法知道活动/片段是否已从非活动状态恢复?
答案 0 :(得分:1)
是否有办法知道活动/片段是否已从非活动状态恢复?
您可以利用以下事实:在终止应用程序的进程后,变量将返回其默认值(未初始化),并将其与常规savedInstanceState
逻辑结合起来。
public class MainActivity extends AppCompatActivity {
private static boolean processWasAliveTheWholeTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
processWasAliveTheWholeTime = true;
} else {
if (!processWasAliveTheWholeTime) {
// if savedInstanceState is not null, that means we're being recreated.
// the only way processWasAliveTheWholeTime could be false is if our process was killed.
}
}
}
}
答案 1 :(得分:0)
请尝试使用LiveData实现ViewModel。对于LiveData,使非生命周期对象了解生命周期。 另外,通过使用SharePreferences持久保存数据来为应用程序过时死亡做准备,因为onSavedInstanceState会删除onDestroy()上的所有数据,SharePreferences可以在应用程序重新启动时保存和检索存储的数据。 ViewModel仅处理与UI相关的事情,不知道任何称为LIFECYCLE的事情。所以这就是为什么要使用观察者模式-LiveData的原因。 如果应用到达onDestroy(),则即使onSavedInstanceState()也无法挽救。 总之,将ViewModel与LiveData结合使用并持久保存数据,以免导致应用程序过时死亡,而不是与onSavedInstanceState()结合使用,而与更强大的功能(如SharedPreferences等)结合使用。