依赖
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())用于指定在主线程中处理服务端的响应数据
