依赖

implementation 'android.arch.lifecycle:extensions:1.1.1'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

android.arch.lifecycle:extensions:1.1.1用于引用ViewModelProviders

ViewModelProviders官方文档

EyeKeyService.java

package com.bu_ish.viewmodeltest.service;import com.bu_ish.viewmodeltest.reply.FaceCheckingReply;
import com.bu_ish.viewmodeltest.reply.FacesComparingReply;import io.reactivex.Single;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;public interface EyeKeyService {String BASE_URL = "http://api.eyekey.com/face/";String APP_ID = "f89ae61fd63d4a63842277e9144a6bd2";String APP_KEY = "af1cd33549c54b27ae24aeb041865da2";@FormUrlEncoded@POST("Check/checking")Single<FaceCheckingReply> checkFace(@Field("app_id") String appId, @Field("app_key") String appKey, @Field("url") String url);@GET("Match/match_compare")Single<FacesComparingReply> compareFaces(@Query("app_id") String appId, @Query("app_key") String appKey, @Query("face_id1") String faceId1, @Query("face_id2") String faceId2);
}

EyeKeyRepository.java

package com.bu_ish.viewmodeltest.view_model;import com.bu_ish.viewmodeltest.service.EyeKeyService;
import com.bu_ish.viewmodeltest.reply.FaceCheckingReply;
import com.bu_ish.viewmodeltest.reply.FacesComparingReply;import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;public class EyeKeyRepository {private static EyeKeyRepository instance = new EyeKeyRepository();private EyeKeyService service;private EyeKeyRepository() {Retrofit retrofit = new Retrofit.Builder().baseUrl(EyeKeyService.BASE_URL).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();service = retrofit.create(EyeKeyService.class);}public static EyeKeyRepository getInstance() {return instance;}public Single<FaceCheckingReply> checkFace(String url) {return setScheduler(service.checkFace(EyeKeyService.APP_ID, EyeKeyService.APP_KEY, url));}public Single<FacesComparingReply> compareFaces(String faceId1, String faceId2) {return setScheduler(service.compareFaces(EyeKeyService.APP_ID, EyeKeyService.APP_KEY, faceId1, faceId2));}private Single setScheduler(Single single) {return single.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());}
}

EyeKeyViewModel.java

package com.bu_ish.viewmodeltest.view_model;import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;import com.bu_ish.viewmodeltest.observer.ReplyObserver;
import com.bu_ish.viewmodeltest.reply.FaceCheckingReply;
import com.bu_ish.viewmodeltest.reply.FacesComparingReply;public class EyeKeyViewModel extends ViewModel {public MutableLiveData<FaceCheckingReply> faceCheckingReply1Data = new MutableLiveData<>();public MutableLiveData<FaceCheckingReply> faceCheckingReply2Data = new MutableLiveData<>();public MutableLiveData<FacesComparingReply> facesComparingReplyData = new MutableLiveData<>();private DialogViewModel dialogViewModel;private EyeKeyRepository eyeKeyRepository;public EyeKeyViewModel(DialogViewModel dialogViewModel) {this.dialogViewModel = dialogViewModel;eyeKeyRepository = EyeKeyRepository.getInstance();}public void checkFace1(String url) {eyeKeyRepository.checkFace(url).subscribe(new ReplyObserver<FaceCheckingReply>(dialogViewModel) {@Overridepublic void onReply(FaceCheckingReply reply) {faceCheckingReply1Data.setValue(reply);}});}public void checkFace2(String url) {eyeKeyRepository.checkFace(url).subscribe(new ReplyObserver<FaceCheckingReply>(dialogViewModel) {@Overridepublic void onReply(FaceCheckingReply reply) {faceCheckingReply2Data.setValue(reply);}});}public void compareFaces(String faceId1, String faceId2) {eyeKeyRepository.compareFaces(faceId1, faceId2).subscribe(new ReplyObserver<FacesComparingReply>(dialogViewModel) {@Overridepublic void onReply(FacesComparingReply reply) {facesComparingReplyData.setValue(reply);}});}
}

ReplyObserver.java

package com.bu_ish.viewmodeltest.observer;import com.bu_ish.viewmodeltest.reply.BaseReply;
import com.bu_ish.viewmodeltest.view_model.DialogViewModel;import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;public abstract class ReplyObserver<T extends BaseReply> implements SingleObserver<T> {public abstract void onReply(T reply);private DialogViewModel dialogViewModel;public ReplyObserver(DialogViewModel dialogViewModel) {this.dialogViewModel = dialogViewModel;}@Overridepublic void onSubscribe(Disposable d) {dialogViewModel.showProgressData.setValue(true);}@Overridepublic void onSuccess(T reply) {dialogViewModel.showProgressData.setValue(false);String code = reply.getResCode();if (code.equals("0000")) {onReply(reply);} else {dialogViewModel.showErrorData.setValue(reply);}}@Overridepublic void onError(Throwable e) {dialogViewModel.showProgressData.setValue(false);dialogViewModel.showExceptionData.setValue(e);}
}

EyeKeyViewModelFactory.java

package com.bu_ish.viewmodeltest.view_model;import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProvider;
import android.support.annotation.NonNull;public class EyeKeyViewModelFactory implements ViewModelProvider.Factory {private DialogViewModel dialogViewModel;public EyeKeyViewModelFactory(DialogViewModel dialogViewModel) {this.dialogViewModel = dialogViewModel;}@NonNull@Overridepublic <T extends ViewModel> T create(@NonNull Class<T> modelClass) {return (T) new EyeKeyViewModel(dialogViewModel);}
}

DialogViewModel.java

package com.bu_ish.viewmodeltest.view_model;import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;import com.bu_ish.viewmodeltest.reply.BaseReply;public class DialogViewModel extends ViewModel {public MutableLiveData<Boolean> showProgressData = new MutableLiveData<>();public MutableLiveData<BaseReply> showErrorData = new MutableLiveData<>();public MutableLiveData<Throwable> showExceptionData = new MutableLiveData<>();
}

使用ViewModel的好处

即使发生配置变更(Configuration Change),ViewModel中的数据依然存在

所以,使用ViewModel后,也就不需要考虑onSaveInstanceState这类操作了^_^

参考博文

MVVM 架构,ViewModel和LiveData(一)

完整Demo

链接:https://pan.baidu.com/s/1TwY9OZTaQPk1eCn7vSz4fA,提取码:x0fy

转载于:https://www.cnblogs.com/buyishi/p/10663895.html

Android笔记之ViewModel的使用示例相关推荐

  1. Android 笔记之 R 文件

    Android笔记之R文件 阅读目录 介绍 R 文件的内容 介绍 通过 R 文件引用资源 一.R 文件的内容 在 Android Studio 中 R 文件位于 app -> build -&g ...

  2. Android Jetpack 之 ViewModel

    前言 在 Android 中,ViewModel 的作用就是在 UI 控制器( 如 Activity.Fragment)的生命周期中保存和管理 UI 相关的数据.ViewModel 保存的数据在配置更 ...

  3. Android笔记 fragment的生命周期

    demo执行顺序 10-22 20:38:10.281: I/System.out(26337): onAttach     附加到Activity  10-22 20:38:10.281: I/Sy ...

  4. Android View添加 Listener 小技巧示例

    Android View添加 Listener 小技巧示例 关键字: android .view.listener.小技巧 在开发中为控件添加Listener是非常常见的工作,最简单的添加Listen ...

  5. Android笔记:浅析Android电视APP开发

    TV应用程序使用相同的结构与手机和平板电脑.这种相似性意味着你也可以修改现有的应用程序运行在TV设备或创建新的应用程序基于你现在已经掌握的Android技术开发应用. 1.创建Android TV工程 ...

  6. android listview替代,Android笔记——RecyclerView替代ListView

    ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...

  7. Android笔记:触摸事件的分析与总结----多点触控

       其他相关博文:    Android笔记:触摸事件的分析与总结----MotionEvent对象    Android笔记:触摸事件的分析与总结----TouchEvent处理机制     An ...

  8. 炼数成金Tensorflow学习笔记之2.4_Tensorflow简单示例

    炼数成金Tensorflow学习笔记之2.4_Tensorflow简单示例 代码及分析 代码及分析 # -*- coding: utf-8 -*- """ Created ...

  9. Adams学习笔记 第二讲 Adams入门示例

    Adams学习笔记 第二讲 Adams入门示例 Falling Stone石头坠落 问题描述 使用步骤 结论与分析 软件环境:Adams2018(官方文档使用的开发环境为2013.2) 声明:本讲内容 ...

最新文章

  1. is 和 ==的区别
  2. DPOS共识算法—缺失的白皮书
  3. 在WPF的WebBrowser控件中抑制脚本错误
  4. WIKIOI 1519 过路费
  5. 评论:电商巨头们谁有勇气晒晒“价格战”账单?
  6. Java 算法 单词接龙
  7. [导入]给老家新楼的对联
  8. 【剑指 offer】(十九)—— 二叉树镜像
  9. 使用npm-check-updates模块升级插件
  10. java生成mib文件_【snmp】使用MIB Builder生成MIB文件
  11. 大学生发展规划与就业指导(三)
  12. 人工神经网络理论及应用,人工智能神经网络论文
  13. 如何评价 IEEE Access 成为了 Top 期刊?
  14. 走进小作坊(十三)----并购之战
  15. Verilog乘法的实现——Xilinx Multiplier IP研究(1)
  16. ios降级鸿蒙,iOS 降级 13.3 系统方法,你成功了没
  17. 关于python操作cad的2021-06-18
  18. DustBot机器人
  19. 更名通知 || 初心未改,只为更好,好嗨游戏来了
  20. canvas画板总结

热门文章

  1. 你知道实习对你有多重要吗?
  2. MYSQL企业常用架构与调优经验分享
  3. 细说Debug和Release区别
  4. 【124】排球基本技术
  5. glusterfs基本操作
  6. MySQL数据类型--------浮点类型实战
  7. 安装VCenter提示数据库排序规则有问题
  8. KDD 2017奖项全公布,华人成最大赢家
  9. cocos2d-x在win7下的android交叉编译环境
  10. 30个在线学习设计与开发的站点