我该如何使其实时数据观察器基于带有一些用户输入的用户点击事件,但应该从onCreate开始观察?

问题描述 投票:0回答:1

我进行了改造,然后是存储库,然后是模型,然后是视图,但是在单击按钮观察器时,不要在onChanged中观察。来自onClick的OnClicking on按钮,一切正常。我在logcat中收到API响应,但是在onChanged中却没有调用它!

ManualLicenseKeyViewModel

代码:

public class ManualLicenseKeyViewModel extends ViewModel {
    public MutableLiveData<String> key = new MutableLiveData<>();
    private MutableLiveData<License> mutableLiveData;
    private ManualLicenseRepository manualLicenseRepository;


    public void init() {
        if (mutableLiveData == null) {
            manualLicenseRepository = ManualLicenseRepository.getInstance();
        }
    }

    public LiveData<License> getLicenseRepository() {
        return mutableLiveData;
    }

    private void getLicenseData(String licenseKey, String macAddress, int productId) {
        mutableLiveData = manualLicenseRepository.getLicenseData(licenseKey, macAddress, productId);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_submit:
                try {
                    getLicenseData(key.getValue(), "null", FIXED_PRODUCT_ID);
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
                break;


        }
    }

}

活动-onCreate:

protected void init() {
        manualLicenseKeyViewModel.init();
        manualLicenseKeyViewModel.getLicenseRepository().observe(this, this);
    }


  @Override
    public void onChanged(License license) {
        showLog("Working?");
        try {
            showLog("license: " + license.getLicensekey());
        } catch (Exception e) {

        }
    }

NOTE:如果我通过init方法,则在以下情况下有效,但问题是,我想在用户单击事件中执行并从提交按钮之前的编辑文本中获取值。我也不想在视图模型本身中观察,因为我想要有关活动的数据!

 public void init() {
        if (mutableLiveData == null) {
            manualLicenseRepository = ManualLicenseRepository.getInstance();
            mutableLiveData = manualLicenseRepository.getLicenseData("QQQQQ", "null", 4);
        }
    }

再次说明:

问题是,如果我在onCreate中编写了观察语句,它将不会基于用户的单击事件进行观察。因为我只想在用户在编辑文本中填写值并提交按钮时才调用存储库API,所以只有我可以获取必须传递到存储库中才能进行API调用并将该值传递给API的值。

java android android-livedata
1个回答
0
投票

通话时

mutableLiveData = manualLicenseRepository.getLicenseData(licenseKey, macAddress, productId);

您已经在onCreate中将活动观察者设置为mutableLiveData的实例。设置新的mutableLiveData实例后,所有观察者都将退订,因为先前的实例不再存在,因此您的观察者将不会收到任何结果。

将数据发送给观察者的更好方式是MutableLiveData.postValue(value)。在这种情况下,您无需创建新的实时数据实例并取消订阅观察者,而只是向活动观察者发布值。

但是,如果您只需要在用户按下按钮后获取许可证数据一次,则最好拨打Room suspend function并显示纯数据

P.S。最好在onViewCreated中添加观察者,而不是在onCreate

中添加观察者
© www.soinside.com 2019 - 2024. All rights reserved.