【问题标题】:Why onChange() called twice when fragment recreated为什么在片段重新创建时 onChange() 调用了两次
【发布时间】:2017-07-01 16:22:36
【问题描述】:

我正在尝试使用新的 android 架构组件,但我有一刻感到困惑。

我创建了一个 ViewModel 类

public class BuyViewModel extends ViewModel {

private BuyRepository buyRepository;
private LiveData<Adverts> advertsLiveData;
private boolean isLoading;
private int currentPage;

@Inject
public BuyViewModel(BuyRepository buyRepository) {
    this.buyRepository = buyRepository;
}

public void init(int currentPage) {
    this.currentPage = currentPage;
    if (this.advertsLiveData != null) {
        return;
    }
    Timber.tag("logi").d("BuyViewModel > init -> ");
    advertsLiveData = buyRepository.getAdverts(currentPage);
}

public LiveData<Adverts> getAdvertsLiveData() {
    return advertsLiveData;
}
}

在我的 LifeCycleFragment 中观察 LiveData

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    buyViewModel = ViewModelProviders.of(this, viewModelFactory).get(BuyViewModel.class);
    buyViewModel.init(1);
    buyViewModel.getAdvertsLiveData().observe(this, adverts -> {
        Timber.tag("logi").d("BuyFragment > onActivityCreated -> ");
        assert adverts != null;
        adapter.addMoreAdverts(adverts.getResults());
    });

    setupViews();
}

但是当我用另一个片段替换这个片段并切换回这个片段时,方法onChange被调用了两次,并在rvAdapter中添加了相同数据的两个部分。

【问题讨论】:

    标签: android viewmodel android-architecture-components android-livedata


    【解决方案1】:

    我解决了这个问题!!! 当我创建我的 ViewModel 类时,我将“this”第一个参数传递给方法

    buyViewModel = ViewModelProviders.of(**this**, viewModelFactory).get(BuyViewModel.class);

    但我需要通过“getActivity()”,代码看起来像这样

    buyViewModel = ViewModelProviders.of(**getActivity()**,viewModelFactory).get(BuyViewModel.class);

    【讨论】:

    • 这对我不起作用 onChange() 仍然被触发
    【解决方案2】:

    当您在片段中传递“this”时 - 它会获取片段的实例。更改配置后,片段的 onDestroy() 不会调用(应该取消订阅的地方),而只会调用 onDestroyView()。因此,当您传递活动实例时,它会取消订阅,因为调用了活动的 onDestroy()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      相关资源
      最近更新 更多