当Fragment重新创建时,为什么会调用两次onChange()函数?

4

我想要使用新的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();
}

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

2个回答

6
我解决了这个问题!!!在创建ViewModel类时,我将“this”作为第一个参数传递给方法。 buyViewModel = ViewModelProviders.of(**this**, viewModelFactory).get(BuyViewModel.class); 但是,我需要传递“getActivity()”,代码看起来像这样: buyViewModel = ViewModelProviders.of(**getActivity()**,viewModelFactory).get(BuyViewModel.class);

1
这对我没有用,onChange()仍然被触发。 - A-J-A

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接