我进行了改造,然后是存储库,然后是模型,然后是视图,但是在单击按钮观察器时,不要在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的值。
通话时
mutableLiveData = manualLicenseRepository.getLicenseData(licenseKey, macAddress, productId);
您已经在onCreate
中将活动观察者设置为mutableLiveData
的实例。设置新的mutableLiveData
实例后,所有观察者都将退订,因为先前的实例不再存在,因此您的观察者将不会收到任何结果。
将数据发送给观察者的更好方式是MutableLiveData.postValue(value)
。在这种情况下,您无需创建新的实时数据实例并取消订阅观察者,而只是向活动观察者发布值。
但是,如果您只需要在用户按下按钮后获取许可证数据一次,则最好拨打Room suspend function并显示纯数据
P.S。最好在onViewCreated中添加观察者,而不是在onCreate
中添加观察者