MVVM初体验

2018-01-23  本文已影响0人  举不动的例子

WHAT?

mvvm is ?

图片来自csdn某个老哥时间久远找不到作者了如果侵权了可以私信我我删掉自己画一哈(懒死我了)

mvvm

mvc mvp ?

WHY?

优点

缺点

HOW?

使用Android Architecture Components(aac)框架

一: 初步配置环境

首先需要引入 Lifecycles, LiveData and ViewModel(该库存在于google的maven仓库中需要在项目gradle中引入google的maven)然后再在module模块下引入相应的库。需要注意的是lifecycle包内会依赖support包也许会和部分项目造成冲突,注意项目内需要使用什么版本。

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

需要注意的是目前低版本的support-fragment and appcompat-v7(version<26.0.0)必须使activity和fragment继承LifecycleActivity和LifecycleFragment,在高版本中FragmentActivity 和 AppCompatActivity 都实现了 LifecycleOwner接口不必再继承

    //aac
    compile "android.arch.lifecycle:runtime:$rootProject.lifecycleRuntime"
    compile("android.arch.lifecycle:extensions:${rootProject.lifecycle}")

            {
                exclude group: 'com.android.support'
            }

    annotationProcessor "android.arch.lifecycle:compiler:$rootProject.lifecycle"

二:java代码配置部分

model:普通的pojo类即可

public class User  {
    private int id;
    private String name;
// ...getter setter and toString...
}

view:普通的xml文件即可(此处暂时没有结合databinding)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:id="@+id/ll_root"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_id"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tv_name"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

viewmodel:viewmodel就很类似mvc模式中的controller和mvp种的presenter由于我们集成了aac框架所以直接写一个类集成viewmodel就行,它可以帮我们自动管理ui的生命周期

public class UserViewModel extends ViewModel {}

先写一个空方法,具体内部实现后面说。

livedata:轻松实现数据和view(ui)绑定的好工具,livedata可以自动响应生命周期,数据在改变的时候可以通知观察者更新ui,就是因为这点可以轻松实现model和view的绑定
具体用法:

首先创建可变的livedata即mutablelivedata

private MutableLiveData<String> mCurrentName;

public MutableLiveData<String> getCurrentName() {
    if (mCurrentName == null) {
        mCurrentName = new MutableLiveData<String>();
    }
    return mCurrentName;
}

其次在activity/fragment中观察livedata。也就是当livedata数据发生变化时,自动回调方法来更新 ui。

Observer<String> nameObserver = new Observer<String>() {
    @Override
    public void onChanged(@Nullable final String newName) {
        mNameTextView.setText(newName);
    }
};
getCurrentName().observe(this, nameObserver);

最后更新数据

mButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        String anotherName = "licz";
        getCurrentName().setValue(anotherName);
    }
});

livedata+viewmodel:为了显示id和name我们需要一个livedata<user>,我们在viewmodel中暴露一些set/get方法来改变livedata<user>内的数据

public class UserViewModel extends ViewModel {
    private MutableLiveData<User> user;

    public LiveData<User> getUser() {
        if (user == null)
            user = new MutableLiveData<>();
        return user;
    }

    public void setUsername(String username) {
        user.setValue(new User(1, username));
    }
}

view+viewmodel:livedata它可以方便的被观察。viewmodel,可以自动响应生命周期。这两个东西的结合可以帮我们方便的实现数据绑定。下面我们来说说viewmodel怎么和view绑定,然后自动响应activity/fragment的生命周期

private UserViewModel userViewModel;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initData();

    }

    private void initData() {
        userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
        userViewModel.getUser().observe(this, new Observer<User>() {
            @Override
            public void onChanged(@Nullable User user) {
                updateView(user);
            }
        });

        userViewModel.setUsername("licz");
    }

    private void updateView(User user) {
        tvId.setText(user.getId() + "");
        tvName.setText(user.getName());
    }

通常来说,一个view只和一个viewmodel 绑定。所以我们需要一个activity级别的单例viewmodel,我们就是通过ViewModelProviders.of(this).get(UserViewModel.class) 来简单的实现。然后通过userViewModel取得LiveData并添加监听(绑定操作)。
三:aac框架实现总结
这样的一个框架的存在帮助我们解决了很多痛点问题,比如说以后就不需要为同一份数据n处都修改view的问题头疼了,再比如数据请求可以更为纯粹不需要考虑ui是怎么渲染和实现的。再做完数据请求或者完成数据更新以后,livedata会自动通知ui根据数据处理界面。
在aac框架的基础上结合databinding后我们可以完全不需要自己手动处理ui,而viewmodel和model通过livedata作为桥梁相连接,view和viewmodel双向绑定,由于viewmodel自动响应生命周期我们也可以很轻松处理view生命周期相关的ui需求。
最后aac框架不是实现mvvm的必要途径只是他可以为我们解决很多实现mvvm过程中的痛点

上一篇 下一篇

猜你喜欢

热点阅读