我不了解以下方法的目的。
android.arch.lifecycle.ViewModelProviders.of(
FragmentActivity activity,
ViewModelProvider.Factory factory)
假设我们有Activity1
的子类FragmentActivity
。假设Android因为用户启动而创建了Activity1
的实例a0
,然后因为用户旋转了屏幕,所以Android创建了Activity1
的实例a1
是因为用户旋转了屏幕,所以{{1}从用户的角度来看,}和a0
是相同的活动。据我了解,a1
方法应在of
中调用。我还在examples中看到,Activity1.onCreate
的呼叫也是在factory
中创建的。假设在Activity1.onCreate
中创建了factory0
,并且在a0.onCreate
中创建了factory1
。我认为
a1.onCreate
和
ViewModelProviders.of(a0, factory0).get(ProductViewModel.class)
必须返回相同的对象引用,因为该对象必须超过ViewModelProviders.of(a1, factory1).get(ProductViewModel.class)
和a0
。但是如果a1
和factory0
是不同的引用,怎么可能?
这不是一个有争议的问题。工厂可以包含一个写入factory1
实例的值,例如示例中的ProductViewModel
。继续示例,如果
productId
的价值是什么
factory0 = new ProductViewModel.Factory(..., 0);
factory1 = new ProductViewModel.Factory(..., 1);
是ViewModelProviders.of(a1, factory1).get(ProductViewModel.class).mProductId
还是0
?如果1
,这是否是不正确的行为?如果是0
,那么我相信活动UI的状态将会丢失,这也很糟糕。
相关代码摘录。
1
和
public class ProductFragment extends Fragment {
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ProductViewModel.Factory factory = new ProductViewModel.Factory(
getActivity().getApplication(), getArguments().getInt(KEY_PRODUCT_ID));
final ProductViewModel model = ViewModelProviders.of(this, factory)
.get(ProductViewModel.class);
...
}
答案 0 :(得分:0)
如果您对整个活动生命周期的工作方式有错误的了解,我会两次理解您的问题。
假设由于用户启动了Android,因此创建了Activity1的实例a0 然后,Android创建了Activity1的实例a1,因为用户 旋转屏幕,因此a0和a1是来自用户 观点。
方向改变后,活动将被销毁,并且与活动相关的所有数据也将被销毁,直到将其保存到savedPreference或ViewModel或DB中为止。
因此,简单来说,一旦更改方向,应用程序的状态就会丢失,因此不会出现a0
或a1
。
因此没有factory0
和factory1
整个应用程序数据被重置,并且仅在方向更改前作为应用程序的单个状态保存在viewModel中,因此当您进行onCreate()
的活动运行时,可以通过使用工厂获取的ViewModel数据来恢复应用程序的最后状态它的实例。因此,换句话说,ViewModel不会被破坏,而您的活动也会被破坏。只需将您的ViewModel当作Db即可将应用程序的状态动态保存在设备的内存中。
是0还是1?如果为0,这不是不正确的行为吗?如果是1,那么我 相信活动UI的状态会丢失,这也很糟糕。
在更改方向之前,不会有0
或1
ViewModel包含最后一个数据。(您可以将其称为0
,即旧数据)。更改,然后再次更改应用程序的状态,然后更新ViewModel,那就是newwState。
因此从图表上方看,活动被销毁,即活动实例被销毁。
注意::ViewModel不是活动生命周期的一部分