Android Advanced MVVM+DataBinding Framework Mode (обновление)

Фреймворк MVVM

Введение в архитектуру MVVM
В C# очень рано появилась модель разработки MVVM, а MVVM в мобильных телефонах Android не был запущен до конференции Google I\O в прошлом году, не слишком поздно. Излишне говорить, что преимущества режима разработки MVVM позволяют реализовать развязку кода представления и логики. Более того, по словам Google, использование режима разработки MVVM также может повысить скорость разбора файлов макета. Лично я считаю, что это очень важный. важный. Нам часто приходится писать много findViewById в Android-разработке, что раздражает.Многие не хотят писать императоры, поэтому используют какие-то фреймворки аннотаций.Однако, как бы ни была хороша производительность фреймворка аннотаций, эффективность всегда ниже, чем у findViewById, поэтому в Android MVVM или привязка данных могут помочь нам полностью решить эту проблему

Фреймворк MVVM реализует привязку данных и представлений (DataBinding).При изменении данных представление будет автоматически обновляться, наоборот, при изменении представления данные автоматически будут новым
вставьте сюда описание изображения
режимом MVVM.Как и режим MVP, это также делит приложение на три слоя, и обязанности каждого соответствующего слоя аналогичны:

  • Слой модели, который в основном отвечает за предоставление данных. Уровень модели обеспечивает структуру данных бизнес-логики (например, классы сущностей), обеспечивает сбор данных (например, получает данные из локальной базы данных или удаленной сети) и обеспечивает хранение данных.
  • Просмотр слоя, который в основном отвечает за отображение интерфейса. Слой View не требует обработки бизнес-логики, он содержит ссылку на уровень ViewModel и уведомляет уровень ViewModel, когда требуется обработка бизнес-логики.
  • Слой ViewModel, который в основном отвечает за обработку бизнес-логики. Слой ViewModel не требует каких-либо манипуляций с представлениями. С помощью официально предоставленной библиотеки привязки данных данные на уровне представления и уровне модели представления могут быть связаны, а изменения в данных на уровне модели представления могут автоматически уведомлять слой представления об обновлении, поэтому слой модели представления не должен содержать ссылка на слой просмотра. Слой ViewModel можно рассматривать как комбинацию модели данных слоя View и уровня Presenter.

Самая большая разница между шаблоном MVVM и шаблоном MVP заключается в том, что слой ViewModel не содержит ссылки на слой View. Это еще больше уменьшает связь, и изменения в коде слоя View не повлияют на слой ViewModel.

Шаблон MVVM имеет следующие преимущества перед шаблоном MVP:

  • Сцепление дополнительно снижается. Слой ViewModel не содержит ссылку на слой View.При изменении слоя View, пока данные, привязанные к слою View, остаются неизменными, слой ViewModel не нужно менять. В режиме MVP при изменении уровня представления интерфейс для работы с представлением необходимо соответствующим образом изменить, поэтому необходимо изменить уровень докладчика.
  • Больше не нужно писать шаблонный код. С помощью официальной библиотеки привязки данных можно добиться привязки между пользовательским интерфейсом и данными, и нет необходимости писать много кода для findViewById() и рабочих представлений. Короче говоря, код Activity/Fragment может быть довольно лаконичным.

1. Шаги по использованию DataBinding:

  • enableDataBinding
  • Измените файл макета на макет DataBinding.
  • привязка данных

Во-вторых, используйте шаги структуры MVVM:

  • Обеспечьте View, ViewModel и Model три слоя
  • Измените макет на макет DataBinding.
  • Связь между View и ViewModel через DataBinding
  • Получить данные и отобразить их в интерфейсе

Полное название MVVM — Model (модель) — View (представление) — ViewModel (модель представления):

MVVM можно рассматривать как обновленную версию MVP, заменив Presenter на VIewModel. Ключ заключается в двусторонней привязке между представлением и моделью.Когда представление имеет пользовательский ввод, ViewModel уведомляет модель об обновлении данных.Точно так же, после обновления данных модели, ViewModel уведомляет представление об обновлении.

Преимущества MVVM заключаются в следующем:
1. Представление и модель связаны в обоих направлениях. Изменения в одной стороне повлияют на другую сторону, поэтому разработчикам не нужно вручную изменять данные пользовательского интерфейса
2. Нет необходимости findViewById или масляный нож, и нет необходимости получать конкретное представление для установки прослушивателей привязки данных и т. д., их можно выполнить с помощью DataBinding
3. Двусторонняя привязка представления и модели поддерживает обнаружение жизненного цикла, и нет необходимости беспокоиться о странице уничтожение и обратные вызовы.Это делает lifeCycle.4.Это
не будет похоже на MVC, количество кода в Activity огромно, и не будет большого количества интерфейсов View и Presenter как MVP. Структура проекта менее связана

что такое привязка данных

DataBinding — это фреймворк, официально выпущенный Google. Как следует из названия, это привязка данных. Это реализация шаблона MVVM на Android. Он используется для уменьшения связи между макетом и логикой и делает логику кода более понятной.

Затем сначала войдите в тему
, чтобы включить привязку данных:
Способ включения привязки данных заключается в добавлении следующего кода в файл build.gradle соответствующей модели.После синхронизации может быть введена поддержка привязки данных.

android {
    
    
    ...
    dataBinding {
    
    
        enabled = true
    }
}

Ниже приводится подробное введениеФреймворк MVVM:

1. Уровень VM:
Здесь, в соответствии с файлом макета activity_mvvmpattern MVVMActivity, вводится привязка данных:

Привязка данных по-прежнему имеет определенные требования к используемой среде: версия Android Studio выше 1.3, а версия gradle должна быть выше 1.5.0-alpha1.
Необходимо загрузить репозиторий поддержки Android в диспетчере Android SDK.

Затем добавьте соответствующий модуль build.gradle:

android {
    
    
  ....
  dataBinding {
    
    
      enabled =true
  }
}

Затем используйте синтаксис привязки данных для привязки данных к xml, мы привязываем событие Click и результат вывода к виртуальной машине.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
         <!--使用import来导入需要用的包-->
        <import type="android.view.View" />
         <!--使用关键字variable来声明一个变量,name为变量名,type为指向的对象,可以是类名也可以是类名的别名-->
        <variable
            name="userViewModel"
            type="com.mvvm.model.mvvm.viewmodel.MVVMDataViewModel" />

        <variable
            name="handlers"
            type="com.mvvm.model.mvvm.view.MVVMActivity" />
        <!--对于基本类型,可以像java代码一样不用去导入包,直接使用-->
        <variable
            name="data"
            type="String" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/btnMVVM"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{handlers.onClickLoadData}"
            android:text="点击请求数据" />

        <Button
            android:id="@+id/btnToast"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{handlers.onClickShowToastName}"
            android:text="点击请求数据并Toast提示" />
            
        <!--使用变量-->
        <TextView
            android:id="@+id/tvData"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{userViewModel.data}" />
    </LinearLayout>
</layout>

В узле переменной, определенном в данных, атрибут имени представляет имя переменной, тип представляет тип переменной, а экземпляр — это местоположение нашего класса сущности.Конечно, вы также можете изменить это здесь:

<data>
        <import type="android.view.View" />
        <variable
            name="userViewModel"
            type="com.mvvm.model.mvvm.viewmodel.MVVMDataViewModel" />
    </data>

BaseObservable, observable: класс Observer
или MVVMDataViewModel в качестве примера, BaseObservable предоставляет два метода для обновления пользовательского интерфейса, а именно notifyPropertyChanged() и notifyChange()
   . refreshes Обновит имя
   2.notifyChange(), обновит весь пользовательский интерфейс

Класс Bean наследует BaseObservable
notifyPropertyChanged() должен передать параметр типа int, который является int fieldId, который ссылается на формальное имя параметра.

Bindable используется для привязки данных к представлениям.
Класс, специфичный для уровня VM: обратите внимание, что @Bindable необходимо добавить к определенным атрибутам, иначе привязка будет недействительной.

public class MVVMDataViewModel extends BaseObservable implements MVVMLoadDataCallback{
    
    
    private MVVMDataModel model;

    public MVVMDataViewModel() {
    
    
        model = new MVVMDataModel();
    }

    /**
     * 必须添加@Bindable注释
     * @return
     */
    @Bindable
    public String getData() {
    
    
        return model.mData;
    }

    public void loadUserData() {
    
    
        model.requestData(this);
    }

    @Override
    public void onSuccess() {
    
    
        notifyPropertyChanged(com.mvvm.model.BR.data);
    }

    @Override
    public void onFailure() {
    
    

    }
}

Выберите БР под своим проектом или третий БР

2. Уровень представления (MVVMActivity) знакомит с ВМ:

/**
 * View层
 */
public class MVVMActivity extends AppCompatActivity {
    
    
    private MVVMDataViewModel userViewModel;
    private TextView tvData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        ActivityMvvmpatternBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_mvvmpattern);
        userViewModel = new MVVMDataViewModel();
        binding.setUserViewModel(userViewModel);
        binding.setHandlers(this);

        tvData = binding.tvData;

    }

    public void onClickShowToastName(View view) {
    
    
        Toast.makeText(this, tvData.getText().toString(), Toast.LENGTH_LONG).show();
    }

    public void onClickLoadData(View view) {
    
    
        userViewModel.loadUserData();
    }
}

3. Уровень модели:
используется для определенных операций запроса данных .

/**
 * Model层
 */
public class MVVMDataModel {
    
    
    public String mData;
 
    public MVVMDataModel() {
    
    
        this.mData = "初始数据";
    }
 
    public void requestData(MVVMLoadDataCallback callback) {
    
    
        this.mData = "数据请求成功";
        callback.onSuccess();
    }
}

Несмотря на то, что MVVM обладает этими преимуществами, в нем также есть много подводных камней, поэтому в фактической разработке находится не так много приложений MVVM framework, в основном основанных на разработке MVP framework.

Наконец, предоставьте исходный код github для справки: testMVVM

рекомендация

отblog.csdn.net/qq_35091074/article/details/123351470