Android笔记之ViewModel的使用示例
2024-09-04 16:01:06
依赖
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
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) {
@Override
public void onReply(FaceCheckingReply reply) {
faceCheckingReply1Data.setValue(reply);
}
});
} public void checkFace2(String url) {
eyeKeyRepository.checkFace(url).subscribe(new ReplyObserver<FaceCheckingReply>(dialogViewModel) {
@Override
public void onReply(FaceCheckingReply reply) {
faceCheckingReply2Data.setValue(reply);
}
});
} public void compareFaces(String faceId1, String faceId2) {
eyeKeyRepository.compareFaces(faceId1, faceId2).subscribe(new ReplyObserver<FacesComparingReply>(dialogViewModel) {
@Override
public 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;
} @Override
public void onSubscribe(Disposable d) {
dialogViewModel.showProgressData.setValue(true);
} @Override
public void onSuccess(T reply) {
dialogViewModel.showProgressData.setValue(false);
String code = reply.getResCode();
if (code.equals("0000")) {
onReply(reply);
} else {
dialogViewModel.showErrorData.setValue(reply);
}
} @Override
public 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
@Override
public <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这类操作了^_^
参考博文
完整Demo
链接:https://pan.baidu.com/s/1TwY9OZTaQPk1eCn7vSz4fA,提取码:x0fy
最新文章
- 现代3D图形编程学习-环境设置
- 跳转到某个Activity
- python os模块(2)
- Jmeter beanshell 生成手机号加密签名
- html特殊字符转义问题(转!)
- 手把手教你学会 Emacs 定制
- rotate array 旋转数组
- 在Linux或者Unix下打开,每一行都会出多出^M这样的字符
- jqGrid(struts2+jdbc+jsp)增删改查的例子
- 电梯调度--c++--软件工程
- 记一次高级java工程师职位的面试
- debian 学习记录-5
- Dubbo xml配置 和注解配置 写法
- :before与:after伪类的应用
- 第八届河南省赛F.Distribution(水题)
- 关于WebBrowser.DocumentCompleted事件
- Git Flow——Git团队协作最佳实践
- HDU1864(背包)
- Ubuntu16.04安装NVIDIA驱动时的一些坑与解决方案
- 如何卸载CentOS自带的apache
热门文章
- google搜索打不开?提供 国内几个给力的服务器
- 分享Kali Linux 2017.1镜像
- luogu P1304 哥德巴赫猜想
- yii2操作数据库 mysql 读写分离 主从复制
- 转: scala语言的简单入门 (IBM develop)
- javascript if(条件)------------条件中可以使用的值
- 关于顺序磁盘IO比内存随机IO快的讨论
- solr入门之pinyin4j源代码改写动态加入扩展词及整合进war项目中
- Android学习笔记(24):进度条组件ProgressBar及其子类
- msgsnd的一个小问题