РЕШЕННЫЙ! Ниже для окончательного решенияпривязка данных MVVM, когда модель обновляется по услуге
Проблема: Я пытаюсь использовать привязку данных и MVVM для андроид приложение, но проблема заключается в том, что модель обновляется с помощью службы, которая отделена от MVVM части приложение. Если я обновляю модель через viewmodel, она отлично работает, но я не могу понять, какой способ получить изменение модели до пузырька до модели view, а затем к представлению, когда модель обновляется с помощью оказание услуг.
Приложение: Приложение подключается к внешнему устройству через Bluetooth, а затем поддерживает последовательное соединение, где показания и настройки датчика непрерывно в потоковом режиме из устройства в приложение в близком к реальному времени. Команды также могут быть отправлены на устройство через это соединение. Модель действует как представление устройства в памяти. Различные экраны в приложении отображают пользователю различные разделы модели и могут или не позволяют им настраивать определенные значения (настройки).
Код: (я не могу показать мой точный код, но здесь это упрощенная версия)
Модель:
public class DeviceModel extends BaseObservable {
private int mode;
@Bindable
public int getMode(){
return mode;
}
public void setMode(int mode) {
this.mode = mode;
notifyPropertyChanged(BR.mode);
}
}
ViewModel:
public class BasicViewViewModel extends BaseObservable {
private final Context mContext;
private ObservableField<DeviceModel> modelFields;
public BasicViewViewModel(Context context){
mContext = context.getApplicationContext();
ApplicationBase app = ApplicationBase.getInstance();
modelFields = new ObservableField<>(app.dModel);
}
@Bindable
public String getMode(){
return modelFields.get().Mode;
}
}
Фрагмент:
public class BasicViewFragment extends Fragment {
private FragmentBasicViewBinding mBinding;
private BasicViewViewModel mViewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
mViewModel = new BasicViewViewModel(getContext());
mBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_basic_view, container, false);
View view = mBinding.getRoot();
mBinding.setDevice(mViewModel);
return view;
}
}
Layout:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="device" type="com.example.android.bluetoothcomms.BasicViewViewModel"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="@{device.mode}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvModeVal" />
</RelativeLayout>
</layout>
Таможенный кодекс Применение:
public class ApplicationBase extends Application {
private static ApplicationBase instance;
public BluetoothCommsService btComms;
public DeviceModel dModel;
@Override
public void onCreate(){
super.onCreate();
instance = this;
dModel = new DeviceModel();
btComms = new BluetoothCommsService();
}
public static ApplicationBase getInstance(){
return instance;
}
}
РЕШЕНИЕ В конце концов, я последовал совету @exkoria «ы и использовать EventBus для создания и отправки пользовательского события:
public class DeviceModelUpdateEvent {
public final String fieldName;
public final String newValue;
public DeviceModelUpdateEvent(String field, String value){
fieldName = field;
newValue = value;
}
}
Я поставил обработчик в моей модели просмотра, чтобы вызвать обновление привязки данных в представлении:
@Subscribe
public void onMessageEvent(DeviceModelUpdateEvent event){
switch(event.fieldName){
case "yieldLevel":
notifyPropertyChanged(BR.yieldLevel);
break;
case "mode":
notifyPropertyChanged(BR.mode);
break;
case "deviceType":
notifyPropertyChanged(BR.deviceType);
break;
case "firmwareVersion":
notifyPropertyChanged(BR.firmwareVersion);
}
}
Спасибо! Я совершенно забыл об этой библиотеке, чтобы быть честным и странно, что это не появилось ни в одном из моих поисковых запросов. – Redberry