2016-11-10 7 views
0

РЕШЕННЫЙ! Ниже для окончательного решенияпривязка данных 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); 
    } 
} 

ответ

0

Не может просто добавить слушатель к вашей модели, чтобы ваш ViewModel может отслеживать изменения в модели и обновить представление, когда происходят изменения? Или, может быть, это приятное использование для шины событий, такой как этот: https://github.com/greenrobot/EventBus.

+0

Спасибо! Я совершенно забыл об этой библиотеке, чтобы быть честным и странно, что это не появилось ни в одном из моих поисковых запросов. – Redberry