ViewModel的寿命比其工厂的寿命长

时间:2019-01-07 17:23:53

标签: android android-viewmodel

我不了解以下方法的目的。

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。但是如果a1factory0是不同的引用,怎么可能?

这不是一个有争议的问题。工厂可以包含一个写入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);
        ...
}

1 个答案:

答案 0 :(得分:0)

如果您对整个活动生命周期的工作方式有错误的了解,我会两次理解您的问题。

  

假设由于用户启动了Android,因此创建了Activity1的实例a0   然后,Android创建了Activity1的实例a1,因为用户   旋转屏幕,因此a0和a1是来自用户   观点。

方向改变后,活动将被销毁,并且与活动相关的所有数据也将被销毁,直到将其保存到savedPreference或ViewModel或DB中为止。

因此,简单来说,一旦更改方向,应用程序的状态就会丢失,因此不会出现a0a1

因此没有factory0factory1

整个应用程序数据被重置,并且仅在方向更改前作为应用程序的单个状态保存在viewModel中,因此当您进行onCreate()的活动运行时,可以通过使用工厂获取的ViewModel数据来恢复应用程序的最后状态它的实例。因此,换句话说,ViewModel不会被破坏,而您的活动也会被破坏。只需将您的ViewModel当作Db即可将应用程序的状态动态保存在设备的内存中。

  

是0还是1?如果为0,这不是不正确的行为吗?如果是1,那么我   相信活动UI的状态会丢失,这也很糟糕。

在更改方向之前,不会有01 ViewModel包含最后一个数据。(您可以将其称为0,即旧数据)。更改,然后再次更改应用程序的状态,然后更新ViewModel,那就是newwState。

Activity LifeCycle

因此从图表上方看,活动被销毁,即活动实例被销毁。

注意:ViewModel不是活动生命周期的一部分