Android笔记之Retrofit与RxJava的组合

依赖

1implementation 'com.squareup.retrofit2:retrofit:2.5.0' 2implementation 'com.squareup.retrofit2:converter-gson:2.5.0' 3implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' 4implementation 'io.reactivex.rxjava2:rxjava:2.2.8'implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

Retrofit版本2.5.0

RxJava版本2.2.8

converter-gson:用于将来自服务端的json数据转换为Java对象

adapter-rxjava:用于实现Retrofit和RxJava的组合

rxandroid:用于使用AndroidSchedulers.mainThread()

示例

EyeKeyService.java

1package com.bu_ish.retrofitrxjava; 2 3import io.reactivex.Single; 4import retrofit2.http.Field; 5import retrofit2.http.FormUrlEncoded; 6import retrofit2.http.POST; 7 8public interface EyeKeyService { 9 String BASE_URL = "http://api.eyekey.com/face/"; 10 String APP_ID = "f89ae61fd63d4a63842277e9144a6bd2"; 11 String APP_KEY = "af1cd33549c54b27ae24aeb041865da2"; 12 13 @FormUrlEncoded 14 @POST("Check/checking") 15 Single<FaceCheckingReply> checkFace(@Field("app_id") String appId, @Field("app_key") String appKey, @Field("url") String url); 16}

MainActivity.java

1package com.bu_ish.retrofitrxjava; 2 3import android.app.ProgressDialog; 4import android.support.v7.app.AlertDialog; 5import android.support.v7.app.AppCompatActivity; 6import android.os.Bundle; 7import android.view.View; 8 9import io.reactivex.SingleObserver; 10import io.reactivex.android.schedulers.AndroidSchedulers; 11import io.reactivex.disposables.Disposable; 12import io.reactivex.schedulers.Schedulers; 13import retrofit2.Retrofit; 14import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; 15import retrofit2.converter.gson.GsonConverterFactory; 16 17public class MainActivity extends AppCompatActivity { 18 private ProgressDialog pdHttpRequest; 19 private EyeKeyService service; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 pdHttpRequest = new ProgressDialog(this); 26 pdHttpRequest.setCancelable(false); 27 findViewById(R.id.btnCheckFace).setOnClickListener(new View.OnClickListener() { 28 @Override 29 public void onClick(View v) { 30 String picUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1554372634204&di=a4804907c80d38d4997291e0cb546f71&imgtype=0&src=http%3A%2F%2Fi1.sinaimg.cn%2Fent%2F2011%2F1012%2FU3593P28DT20111012165707.jpg"; 31 service.checkFace(EyeKeyService.APP_ID, EyeKeyService.APP_KEY, picUrl) 32 .subscribeOn(Schedulers.io()) 33 .observeOn(AndroidSchedulers.mainThread()) 34 .subscribe(new SingleObserver<FaceCheckingReply>() { 35 @Override 36 public void onSubscribe(Disposable d) { 37 pdHttpRequest.show(); 38 } 39 40 @Override 41 public void onSuccess(FaceCheckingReply faceCheckingReply) { 42 pdHttpRequest.dismiss(); 43 String code = faceCheckingReply.getResCode(); 44 if (code.equals("0000")) { 45 String faceId = faceCheckingReply.getFaces().get(0).getFaceId(); 46 new AlertDialog.Builder(MainActivity.this).setTitle("Face Id").setMessage(faceId).show(); 47 } else { 48 new AlertDialog.Builder(MainActivity.this).setTitle(code).setMessage(faceCheckingReply.getMessage()).show(); 49 } 50 } 51 52 @Override 53 public void onError(Throwable e) { 54 pdHttpRequest.dismiss(); 55 new AlertDialog.Builder(MainActivity.this).setTitle("Error").setMessage(e + "").show(); 56 } 57 }); 58 } 59 }); 60 service = new Retrofit.Builder() 61 .baseUrl(EyeKeyService.BASE_URL) 62 .addConverterFactory(GsonConverterFactory.create()) 63 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 64 .build() 65 .create(EyeKeyService.class); 66 } 67}

其中的addConverterFactory(GsonConverterFactory.create())用于实现json转换为Java对象

若不添,则抛出如下异常

Caused by: java.lang.IllegalArgumentException: Could not locate ResponseBody converter for class com.bu_ish.retrofitrxjava.FaceCheckingReply.

addCallAdapterFactory(RxJava2CallAdapterFactory.create())用于实现将EyeKeyService中的函数类型设定为RxJava中的被观察者类型

若不添,则抛出如下异常

Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for io.reactivex.Single<com.bu_ish.retrofitrxjava.FaceCheckingReply>.

subscribeOn(Schedulers.io())用于把网络请求切换至子线程

若不添,则抛出异常NetworkOnMainThreadException

observeOn(AndroidSchedulers.mainThread())用于指定在主线程中处理服务端的响应数据

参考博文:RxJava线程切换——ObserveOn和SubscribeOn的区别

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Android笔记之Retrofit与RxJava的组合 - HelloWorld