为什么在重新创建片段时 onChange() 调用两次
Why onChange() called twice when fragment recreated
我正在尝试使用新的 android 架构组件,但有一瞬间我很困惑。
我创建了一个 ViewModel class
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
.
中添加了相同数据的两部分
我解决了这个!!!
当我创建我的 ViewModel class 时,我将 "this" 第一个参数传递给方法
buyViewModel = ViewModelProviders.of(**this**, viewModelFactory).get(BuyViewModel.class);
但我需要通过 "getActivity()",代码看起来像这样
buyViewModel = ViewModelProviders.of(**getActivity()**,viewModelFactory).get(BuyViewModel.class);
当您在片段内部传递 "this" 时 - 它采用片段的实例。配置更改后,片段的 onDestroy() 不会调用(应该取消订阅的地方),而只会调用 onDestroyView()。因此,当您传递 activity 的实例时,它取消订阅,因为调用了 activity 的 onDestroy()。
我正在尝试使用新的 android 架构组件,但有一瞬间我很困惑。
我创建了一个 ViewModel class
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
.
我解决了这个!!! 当我创建我的 ViewModel class 时,我将 "this" 第一个参数传递给方法
buyViewModel = ViewModelProviders.of(**this**, viewModelFactory).get(BuyViewModel.class);
但我需要通过 "getActivity()",代码看起来像这样
buyViewModel = ViewModelProviders.of(**getActivity()**,viewModelFactory).get(BuyViewModel.class);
当您在片段内部传递 "this" 时 - 它采用片段的实例。配置更改后,片段的 onDestroy() 不会调用(应该取消订阅的地方),而只会调用 onDestroyView()。因此,当您传递 activity 的实例时,它取消订阅,因为调用了 activity 的 onDestroy()。