Google JetPack

最近google推出JetPack官方架构组件,最近有时间在网上看了很多类似的文章,对ViewModel和lifeCycle有了大概的了解,谷歌意在使用这些组件完成代码解耦,实现数据驱动UI的模式,但是还没有深入的了解,效率优先,还是动手才能看到这些架构组件具体是怎样的使用,来实现简单的MVVM模式。 每个组件的单独使用网上有很多文章,大家可以自行去查看,我也是拿来主义,直接上代码。

MVVM设计模式:

网络请求:

接口使用的网上一位大神测试用的接口,UI也是直接使用,本人较懒,请求使用流行的Retrofit2+rxjava2,将其封装在BaseModel中:

public class BaseModel {public BaseModel() {}public void getImage(String format, int idx, int n, BaseObserver<ImageBean> observer) {ApiRepertory.getInstance().getService().getImage(format, idx, n).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(observer);}
}复制代码

lifeCycle绑定页面生命周期

此处的Presenter用于将ViewModel中的业务绑定到不同的生命周期中去执行业务逻辑。

public abstract class BaseLifeCycle<P extends BasePresenter> implements ILifeCycle {protected Context mContext;protected P mPresenter;public BaseLifeCycle(Context context) {this.mContext = context;}protected void addPresenter(P mPresenter) {if (mPresenter != null) {this.mPresenter = mPresenter;}}@Overridepublic void onCreate(@Nullable LifecycleOwner owner) {}@Overridepublic void onDestroy(@Nullable LifecycleOwner owner) {}@Overridepublic void onStart(@Nullable LifecycleOwner owner) {}@Overridepublic void onResume(@Nullable LifecycleOwner owner) {}@Overridepublic void onPause(@Nullable LifecycleOwner owner) {}@Overridepublic void onStop(@Nullable LifecycleOwner owner) {}@Overridepublic void onLifecycleChanged(@Nullable LifecycleOwner owner, @Nullable Lifecycle.Event event) {}
}复制代码

这里ILifeCycle接口用来继承LifecycleObserver,SupportActivity内部已经实现了LifecycleOwner接口用来获取lifeCycle,加入LifecycleObserver来添加观察者来响应不同的生命周期。

public interface ILifeCycle extends LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)void onCreate(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)void onDestroy(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_START)void onStart(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)void onResume(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)void onPause(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_STOP)void onStop(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_ANY)void onLifecycleChanged(@Nullable LifecycleOwner owner,@Nullable Lifecycle.Event event);
}
复制代码

还有此处的BasePresenter用来绑定ViewModel,实现其中的业务逻辑。

public abstract class BasePresenter<M extends ViewModel> {protected M mViewModel;public BasePresenter(M viewModel) {if (viewModel != null) {this.mViewModel = viewModel;}}
}
复制代码

下面是将lifeCycle和databinding写入BaseActivity中比较简单,没有集成过多的其他组件。 getLifecycle().addObserver(mLifeCycle);将不同页面的生命周期逻辑绑定到不同页面中, mLifeCycle.addPresenter(mPresenter);将业务处理部分加入到生面周期中,用于在不同的生命周期中处理不同的业务。 startListenerData();此处用于实现ViewModel数据返回View进行响应刷新的逻辑。

public abstract class BaseActivity<L extends BaseLifeCycle, V extends ViewDataBinding, P extends BasePresenter>extends AppCompatActivity{protected Context mContext;protected L mLifeCycle;protected V dataBinding;protected P mPresenter;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mContext = this;dataBinding = DataBindingUtil.setContentView(this, getLayoutRes());initView();getLifecycle().addObserver(mLifeCycle);mLifeCycle.addPresenter(mPresenter);startListenerData();}protected abstract void startListenerData();protected abstract void initView();protected abstract int getLayoutRes();
}
复制代码

下面看下在Activity中的具体实现: ImageViewModel中就是具体的业务逻辑的实现与数据的绑定; MainLifeCycle是该页面的生命周期,presenter在不同的生命周期实现不同的处理。

public class MainActivity extends BaseActivity<MainLifeCycle, ActivityMainBinding, ImagePresenter> {private ProgressDialog mProgressDialog;private ImageViewModel baseViewModel;@Overrideprotected void initView() {mLifeCycle = new MainLifeCycle(this);mProgressDialog = new ProgressDialog(this);mProgressDialog.setMessage("加载中");baseViewModel = ViewModelProviders.of(this).get(ImageViewModel.class);dataBinding.setClick(new ClickHandler());//将presener绑定生命周期mPresenter = new ImagePresenter(baseViewModel);mProgressDialog.show();}@Overrideprotected int getLayoutRes() {return R.layout.activity_main;}@Overrideprotected void startListenerData() {baseViewModel.getMutableLiveData().observe(this, new Observer<Data<ImageBean.ImagesBean>>() {@Overridepublic void onChanged(@Nullable Data<ImageBean.ImagesBean> imagesBeanData) {if (imagesBeanData.getErrorMsg() != null) {Toast.makeText(mContext, imagesBeanData.getErrorMsg(), Toast.LENGTH_SHORT).show();mProgressDialog.dismiss();return;}dataBinding.setImageBean(imagesBeanData.getData());setTitle(imagesBeanData.getData().getCopyright());mProgressDialog.dismiss();}});}public class MainLifeCycle extends BaseLifeCycle<ImagePresenter> {public MainLifeCycle(Context context) {super(context);}@Overridepublic void onStart(@Nullable LifecycleOwner owner) {Log.e("MainActivity", "onCreate");mPresenter.loadImage();}
}
复制代码

好了,简单的mvvm模式大概就是这样,本人能力有限,有很多不足之处,如有大神请指摘,下面贴出代码的GitHub地址:github.com/ale0201/mvv…

Android ViewModel+liveData+lifecycle+databinding打造MVVM相关推荐

  1. Android - ViewModel LiveData

    文章目录 1. 关于ViewModel和LiveData 2. 示例效果 3. 创建ViewModel类 4. 新建两个Fragment 5. Fragment添加到MainActivity中 6. ...

  2. Android的MvVM模式探讨: Databinding 与 ViewModel+LiveData+Repository对比

    Mvvm模式: Databinding 与 ViewModel+LiveData+Repository 作者:Yagami3zZ,转自:https://www.jianshu.com/p/e7628d ...

  3. Mvvm模式: Databinding 与 ViewModel+LiveData+Repository

    前言: 本文主要是对常见设计模式的一些分析,以及讲述在Android项目中实现Mvvm模式的两种方式.通过Databinding或者ViewModel+LiveData+Repository如何实现M ...

  4. 【JetPack+Retrofit+Rxjava】获取Bing每日一图并显示ViewModel+LiveData+DataBinding+MVVM 补充笔记

    扉: 原文来自:Android官方架构组件ViewModel+LiveData+DataBinding架构属于自己的MVVM 很喜欢作者的思路,但是使用Kotlin需要配置的东西好多并且很多细节要重写 ...

  5. Android Jetpack之DataBinding+ViewModel+LiveData+Room

    Android Jetpack之ViewModel.LiveData Android Jetpack之LifeCycle 前言 Jetpack是一个由多个技术库组成的套件,可帮助开发者遵循最佳做法,减 ...

  6. android全局livedata,Android 使用ViewModel,LiveData高效、简

    一.思路 ViewModel作为View监听器和View进行绑定,LiveData数据存放在ViewModel数据持久化,并具有观察性.View通过监听LiveData的数据变化,进行相应的UI操作. ...

  7. Andriod --- JetPack (七):Room + ViewModel + LiveData 增删改查实例

    1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...

  8. viewmodel+livedata+binding 实现listview+adapter

    首先listview 布局,这是一个fragment的layout,通过binding 自动注入! fragment_yao_ce.xml <layout xmlns:android=" ...

  9. Android ViewModel

    In this tutorial, we'll be digging deep into the concept of ViewModel. We'll be developing a Favouri ...

最新文章

  1. adobexd怎么录屏_请问如何使用Adobe XD制作应用动效?
  2. 汇编指令---CDQ
  3. 基于arcgis的python脚本编程视频-面向ArcGIS的Python脚本编程 PDF 高清版
  4. Android Loader机制
  5. boost::signals2模块实现将参数从信号调用传递到槽的示例程序
  6. js选择日期即时把两个日期相差天数显示出来?
  7. Entity Framework 6 Recipes 2nd Edition(13-2)译 - 用实体键获取一个单独的实体
  8. 【HDU - 5094】 Maze (状态压缩+bfs)
  9. Android官方开发文档Training系列课程中文版:Activity测试之创建单元测试
  10. java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量
  11. ios签名软件_使用ios企业签名需要准备哪些?
  12. java excel函数_JAVA实现EXCEL公式专题(四)——字符串函数
  13. 异常笔记:运行hdfs copyFromLocal 上传文件报错
  14. SpringMVC集成shrio框架
  15. Beginning WF 4.0翻译——第一章(创建一个简单的工作流)续二
  16. IMX6UL时钟配置
  17. 短视频推广引流方案怎么做?看这五点,让你快速裂变涨粉
  18. Unity基础案例讲解:创建小型太空射击游戏(四)
  19. python爬虫面试题集锦及答案
  20. ps作图缩小有锯齿的解决方法

热门文章

  1. CentOS7中使用Dockerfile部署后台jar包
  2. DevExpress的TreeList实现自定义节点NodeCell的背景颜色和前景色
  3. Tkinter的entry组件
  4. 【LeetCode】732. 我的日程安排表 III
  5. Flutter+百度人工智能实现测验值app
  6. 字符的用意_通达信某些字符的意义及用法
  7. linux到不了启动界面,Linux 界面不能启动的解决
  8. 神策数据汽车行业解决方案重磅上线,全面赋能车企数字化转型
  9. 大话后端开发的奇淫技巧大集合
  10. websocket与socket.io