簡體   English   中英

為什么片段重新創建時onChange()調用了兩次

[英]Why onChange() called twice when fragment recreated

我正在嘗試使用新的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添加了相同數據的兩部分。

我解決了這個!!! 當我創建ViewModel類時,我將“ this” 1st參數傳遞給方法

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

但是我需要傳遞“ getActivity()”,代碼看起來像這樣

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

當您在片段內部傳遞“ this”時-它采用片段的實例。 更改配置后,片段的onDestroy()將不會調用(應取消訂閱),而只會調用onDestroyView()。 因此,當您傳遞活動實例時,該實例將不再存在,因為調用了活動的onDestroy()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM