Android笔记之ViewModel的使用示例
依赖
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的使用示例相关推荐
- Android 笔记之 R 文件
Android笔记之R文件 阅读目录 介绍 R 文件的内容 介绍 通过 R 文件引用资源 一.R 文件的内容 在 Android Studio 中 R 文件位于 app -> build -&g ...
- Android Jetpack 之 ViewModel
前言 在 Android 中,ViewModel 的作用就是在 UI 控制器( 如 Activity.Fragment)的生命周期中保存和管理 UI 相关的数据.ViewModel 保存的数据在配置更 ...
- Android笔记 fragment的生命周期
demo执行顺序 10-22 20:38:10.281: I/System.out(26337): onAttach 附加到Activity 10-22 20:38:10.281: I/Sy ...
- Android View添加 Listener 小技巧示例
Android View添加 Listener 小技巧示例 关键字: android .view.listener.小技巧 在开发中为控件添加Listener是非常常见的工作,最简单的添加Listen ...
- Android笔记:浅析Android电视APP开发
TV应用程序使用相同的结构与手机和平板电脑.这种相似性意味着你也可以修改现有的应用程序运行在TV设备或创建新的应用程序基于你现在已经掌握的Android技术开发应用. 1.创建Android TV工程 ...
- android listview替代,Android笔记——RecyclerView替代ListView
ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...
- Android笔记:触摸事件的分析与总结----多点触控
其他相关博文: Android笔记:触摸事件的分析与总结----MotionEvent对象 Android笔记:触摸事件的分析与总结----TouchEvent处理机制 An ...
- 炼数成金Tensorflow学习笔记之2.4_Tensorflow简单示例
炼数成金Tensorflow学习笔记之2.4_Tensorflow简单示例 代码及分析 代码及分析 # -*- coding: utf-8 -*- """ Created ...
- Adams学习笔记 第二讲 Adams入门示例
Adams学习笔记 第二讲 Adams入门示例 Falling Stone石头坠落 问题描述 使用步骤 结论与分析 软件环境:Adams2018(官方文档使用的开发环境为2013.2) 声明:本讲内容 ...
最新文章
- is 和 ==的区别
- DPOS共识算法—缺失的白皮书
- 在WPF的WebBrowser控件中抑制脚本错误
- WIKIOI 1519 过路费
- 评论:电商巨头们谁有勇气晒晒“价格战”账单?
- Java 算法 单词接龙
- [导入]给老家新楼的对联
- 【剑指 offer】(十九)—— 二叉树镜像
- 使用npm-check-updates模块升级插件
- java生成mib文件_【snmp】使用MIB Builder生成MIB文件
- 大学生发展规划与就业指导(三)
- 人工神经网络理论及应用,人工智能神经网络论文
- 如何评价 IEEE Access 成为了 Top 期刊?
- 走进小作坊(十三)----并购之战
- Verilog乘法的实现——Xilinx Multiplier IP研究(1)
- ios降级鸿蒙,iOS 降级 13.3 系统方法,你成功了没
- 关于python操作cad的2021-06-18
- DustBot机器人
- 更名通知 || 初心未改,只为更好,好嗨游戏来了
- canvas画板总结