

14:25, EEST

June 21, 2016

Dear all,
I am using the Prosys library for quit some time now with great satisfaction. Recently I switched to using LiveData (Android architecture components) to use viewmodels and separate business logic from UI. It appears that if I call the “viewmodel.setVariable()” from within the onDataChange (MonitoredDataItemListener) the viewmodel.setVariable() is called but the change in value is never observed. Some code to explain:
public class OpcUaViewModel extends ViewModel {
private MutableLiveData integratorOutput;
public MutableLiveData getIntegratorOutput() {
if (integratorOutput == null) {
integratorOutput = new MutableLiveData();
setIntegratorOutput(0.0);
}
return integratorOutput;
}
public void setIntegratorOutput(Double d){
integratorOutput.setValue(d);
}
}
This OpcUaViewModel object is declared in OnCreate as
OpcUaViewModel viewModel = ViewModelProviders.of(this).get(OpcUaViewModel.class);
Then in onDataChange(MonitoredDataItem monitoredDataItem, DataValue dataValue, final DataValue dataValue1) the following is called:
viewModel.setIntegratorOutput(dataValue1.getValue().doubleValue());
Hope somebody can point me in the right direction on this!
Carsten
15:02, EEST

April 3, 2012

Hi,
I have one idea, but that’s about it. I would consult the documentation of LiveData.
Generally all UI toolkits are single-threaded and all updates must be done in the context of a “Platform” Thread.
The onDataChange is called on the PublishTask Thread of the UaClient, therefore at some point before updating the UI typically there would be a “PlatformThread”.runLater/invokeLater etc. call.
The documentaion of the LiveData would say this (so it would seem all updated must be done in the main thread):
https://developer.android.com/…..ta_objects
“Note: You must call the setValue(T) method to update the LiveData object from the main thread. If the code is executed in a worker thread, you can use the postValue(T) method instead to update the LiveData object.”
1 Guest(s)
