android全局VIewModel,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
依赖
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
packagecom.bu_ish.viewmodeltest.service;importcom.bu_ish.viewmodeltest.reply.FaceCheckingReply;importcom.bu_ish.viewmodeltest.reply.FacesComparingReply;importio.reactivex.Single;importretrofit2.http.Field;importretrofit2.http.FormUrlEncoded;importretrofit2.http.GET;importretrofit2.http.POST;importretrofit2.http.Query;public interfaceEyeKeyService {
String BASE_URL= "http://api.eyekey.com/face/";
String APP_ID= "f89ae61fd63d4a63842277e9144a6bd2";
String APP_KEY= "af1cd33549c54b27ae24aeb041865da2";
@FormUrlEncoded
@POST("Check/checking")
Single checkFace(@Field("app_id") String appId, @Field("app_key") String appKey, @Field("url") String url);
@GET("Match/match_compare")
Single compareFaces(@Query("app_id") String appId, @Query("app_key") String appKey, @Query("face_id1") String faceId1, @Query("face_id2") String faceId2);
}
EyeKeyRepository.java
packagecom.bu_ish.viewmodeltest.view_model;importcom.bu_ish.viewmodeltest.service.EyeKeyService;importcom.bu_ish.viewmodeltest.reply.FaceCheckingReply;importcom.bu_ish.viewmodeltest.reply.FacesComparingReply;importio.reactivex.Single;importio.reactivex.android.schedulers.AndroidSchedulers;importio.reactivex.schedulers.Schedulers;importretrofit2.Retrofit;importretrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;importretrofit2.converter.gson.GsonConverterFactory;public classEyeKeyRepository {private static EyeKeyRepository instance = newEyeKeyRepository();privateEyeKeyService service;privateEyeKeyRepository() {
Retrofit retrofit= newRetrofit.Builder()
.baseUrl(EyeKeyService.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
service= retrofit.create(EyeKeyService.class);
}public staticEyeKeyRepository getInstance() {returninstance;
}public SinglecheckFace(String url) {returnsetScheduler(service.checkFace(EyeKeyService.APP_ID, EyeKeyService.APP_KEY, url));
}public SinglecompareFaces(String faceId1, String faceId2) {returnsetScheduler(service.compareFaces(EyeKeyService.APP_ID, EyeKeyService.APP_KEY, faceId1, faceId2));
}privateSingle setScheduler(Single single) {returnsingle.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
EyeKeyViewModel.java
packagecom.bu_ish.viewmodeltest.view_model;importandroid.arch.lifecycle.MutableLiveData;importandroid.arch.lifecycle.ViewModel;importcom.bu_ish.viewmodeltest.observer.ReplyObserver;importcom.bu_ish.viewmodeltest.reply.FaceCheckingReply;importcom.bu_ish.viewmodeltest.reply.FacesComparingReply;public class EyeKeyViewModel extendsViewModel {public MutableLiveData faceCheckingReply1Data = new MutableLiveData<>();public MutableLiveData faceCheckingReply2Data = new MutableLiveData<>();public MutableLiveData facesComparingReplyData = new MutableLiveData<>();privateDialogViewModel dialogViewModel;privateEyeKeyRepository eyeKeyRepository;publicEyeKeyViewModel(DialogViewModel dialogViewModel) {this.dialogViewModel =dialogViewModel;
eyeKeyRepository=EyeKeyRepository.getInstance();
}public voidcheckFace1(String url) {
eyeKeyRepository.checkFace(url).subscribe(new ReplyObserver(dialogViewModel) {
@Overridepublic voidonReply(FaceCheckingReply reply) {
faceCheckingReply1Data.setValue(reply);
}
});
}public voidcheckFace2(String url) {
eyeKeyRepository.checkFace(url).subscribe(new ReplyObserver(dialogViewModel) {
@Overridepublic voidonReply(FaceCheckingReply reply) {
faceCheckingReply2Data.setValue(reply);
}
});
}public voidcompareFaces(String faceId1, String faceId2) {
eyeKeyRepository.compareFaces(faceId1, faceId2).subscribe(new ReplyObserver(dialogViewModel) {
@Overridepublic voidonReply(FacesComparingReply reply) {
facesComparingReplyData.setValue(reply);
}
});
}
}
ReplyObserver.java
packagecom.bu_ish.viewmodeltest.observer;importcom.bu_ish.viewmodeltest.reply.BaseReply;importcom.bu_ish.viewmodeltest.view_model.DialogViewModel;importio.reactivex.SingleObserver;importio.reactivex.disposables.Disposable;public abstract class ReplyObserver implements SingleObserver{public abstract voidonReply(T reply);privateDialogViewModel dialogViewModel;publicReplyObserver(DialogViewModel dialogViewModel) {this.dialogViewModel =dialogViewModel;
}
@Overridepublic voidonSubscribe(Disposable d) {
dialogViewModel.showProgressData.setValue(true);
}
@Overridepublic voidonSuccess(T reply) {
dialogViewModel.showProgressData.setValue(false);
String code=reply.getResCode();if (code.equals("0000")) {
onReply(reply);
}else{
dialogViewModel.showErrorData.setValue(reply);
}
}
@Overridepublic voidonError(Throwable e) {
dialogViewModel.showProgressData.setValue(false);
dialogViewModel.showExceptionData.setValue(e);
}
}
EyeKeyViewModelFactory.java
packagecom.bu_ish.viewmodeltest.view_model;importandroid.arch.lifecycle.ViewModel;importandroid.arch.lifecycle.ViewModelProvider;importandroid.support.annotation.NonNull;public class EyeKeyViewModelFactory implementsViewModelProvider.Factory {privateDialogViewModel dialogViewModel;publicEyeKeyViewModelFactory(DialogViewModel dialogViewModel) {this.dialogViewModel =dialogViewModel;
}
@NonNull
@Overridepublic T create(@NonNull ClassmodelClass) {return (T) newEyeKeyViewModel(dialogViewModel);
}
}
DialogViewModel.java
packagecom.bu_ish.viewmodeltest.view_model;importandroid.arch.lifecycle.MutableLiveData;importandroid.arch.lifecycle.ViewModel;importcom.bu_ish.viewmodeltest.reply.BaseReply;public class DialogViewModel extendsViewModel {public MutableLiveData showProgressData = new MutableLiveData<>();public MutableLiveData showErrorData = new MutableLiveData<>();public MutableLiveData showExceptionData = new MutableLiveData<>();
}
使用ViewModel的好处
即使发生配置变更(Configuration Change),ViewModel中的数据依然存在
所以,使用ViewModel后,也就不需要考虑onSaveInstanceState这类操作了^_^
参考博文
完整Demo
更多推荐
所有评论(0)