zoukankan      html  css  js  c++  java
  • Android笔记之Retrofit与RxJava的组合

    依赖

    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'

    Retrofit版本2.5.0

    RxJava版本2.2.8

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

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

    rxandroid:用于使用AndroidSchedulers.mainThread()

    示例

    EyeKeyService.java

    package com.bu_ish.retrofitrxjava;
    
    import io.reactivex.Single;
    import retrofit2.http.Field;
    import retrofit2.http.FormUrlEncoded;
    import retrofit2.http.POST;
    
    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);
    }

    MainActivity.java

    package com.bu_ish.retrofitrxjava;
    
    import android.app.ProgressDialog;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    
    import io.reactivex.SingleObserver;
    import io.reactivex.android.schedulers.AndroidSchedulers;
    import io.reactivex.disposables.Disposable;
    import io.reactivex.schedulers.Schedulers;
    import retrofit2.Retrofit;
    import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
    import retrofit2.converter.gson.GsonConverterFactory;
    
    public class MainActivity extends AppCompatActivity {
        private ProgressDialog pdHttpRequest;
        private EyeKeyService service;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            pdHttpRequest = new ProgressDialog(this);
            pdHttpRequest.setCancelable(false);
            findViewById(R.id.btnCheckFace).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    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";
                    service.checkFace(EyeKeyService.APP_ID, EyeKeyService.APP_KEY, picUrl)
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new SingleObserver<FaceCheckingReply>() {
                                @Override
                                public void onSubscribe(Disposable d) {
                                    pdHttpRequest.show();
                                }
    
                                @Override
                                public void onSuccess(FaceCheckingReply faceCheckingReply) {
                                    pdHttpRequest.dismiss();
                                    String code = faceCheckingReply.getResCode();
                                    if (code.equals("0000")) {
                                        String faceId = faceCheckingReply.getFaces().get(0).getFaceId();
                                        new AlertDialog.Builder(MainActivity.this).setTitle("Face Id").setMessage(faceId).show();
                                    } else {
                                        new AlertDialog.Builder(MainActivity.this).setTitle(code).setMessage(faceCheckingReply.getMessage()).show();
                                    }
                                }
    
                                @Override
                                public void onError(Throwable e) {
                                    pdHttpRequest.dismiss();
                                    new AlertDialog.Builder(MainActivity.this).setTitle("Error").setMessage(e + "").show();
                                }
                            });
                }
            });
            service = new Retrofit.Builder()
                    .baseUrl(EyeKeyService.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build()
                    .create(EyeKeyService.class);
        }
    }

    其中的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的区别

  • 相关阅读:
    webpack前端构建工具学习总结(一)之webpack安装、创建项目
    NPM、nodeJS安装,grunt自动化构建工具学习总结
    javascript获取childNodes详情,删除空节点
    苹果手机微信上form表单提交的问题
    苹果safari浏览器window.open问题
    微信公众号右上角菜单
    js实现阶乘
    my97DatePicker日期控件——日期输入框联动,使用focus使第二个输入框没展示出日期控件
    事件绑定和普通事件的区别
    Java单例模式的例子
  • 原文地址:https://www.cnblogs.com/buyishi/p/10663225.html
Copyright © 2011-2022 走看看