Rxjava结合Retrofit

本文介绍如何使用Retrofit实现网络请求,包括依赖引入、API接口编写、请求响应处理及异常管理等内容。

1、引入依赖

implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.3.1'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.0'

2、编写api接口

public interface AppApi {

    //用户登录
    @POST("/app/checkLogin")
    Observable<BaseResponse<LoginResponse>> pswLogin(@Body RequestBody requestBody);

    // 获取首页饼状图,在线设备状态
    @POST("/app/getDeviceStatusChart")
    Observable<BaseResponse<DeviceStatusResponse>> getDeviceStatusChart(@Body Map<String, String> request);


    //    POST /app/alarm/getDataHisAlarmList
//            获取历史告警列表
    @POST("/app/getAlarmList")
    Observable<BaseResponse<JSONObject>> getDeviceAlarmList(@Body SearchAlarm searchAlarm);

    // 获取视频设备列表
    @POST("/app/deviceVideo/getVideoList")
    Observable<BaseResponse<List<DeviceVideoResponse>>> getDeviceVideoList(@Body DeviceListRequest request);
    @POST("app/storeTimeInterval")
    Observable<BaseResponse<JSONObject>> appStoreTimeInterval(@Query("organizeIds") String organizeIds,@Query("interval") String interval);
    //视频设备  基本信息
    @POST("/app/deviceVideo/getDeviceVideo")
    Observable<BaseResponse<DeviceVideoInfoResponse>> getDeviceVideo(@Body Map<String, String> request);
    @Multipart
    //文件上传
    @POST("app/uploadVoiceAudio")
    Observable<BaseResponse<JSONObject>> uploadVoiceAudio(@Part MultipartBody.Part voiceAudio,@Query("oIds") String oIds,@Query("count") int count);

}

代理api接口RetrofitClient

public class RetrofitClient {
    private static final RetrofitClient mInstance = new RetrofitClient();
    private static final String TAG ="RetrofitClient" ;
    private AppApi mAppApi;
    public String s ;
    private String mCookie;
    public static RetrofitClient getInstance() {
        return mInstance;
    }
    private RetrofitClient() {
    }
    public AppApi getAppApi() {

        Log.d(TAG, "getAppApi: "+IConstantImpl.BASE_URL);
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .retryOnConnectionFailure(true)
                .connectTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .addInterceptor(sLoggingInterceptor)
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(IConstantImpl.BASE_URL)
               .addConverterFactory(ResponseConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();

        if (mAppApi == null) {
            mAppApi = retrofit.create(AppApi.class);
        }
        return mAppApi;
    }

    /**
     * 打印返回的json数据拦截器
     */
    private static final Interceptor sLoggingInterceptor = new Interceptor() {

        @Override
        public Response intercept(Chain chain) throws IOException {
            final Request request = chain.request();
            Buffer requestBuffer = new Buffer();
            if (request.body() != null) {
                request.body().writeTo(requestBuffer);
            } else {
                Log.d("LogTAG", "request.body() == null");
            }
            //打印url信息
            Log.w("LogTAG",request.url() + (request.body() != null ? "?" + _parseParams(request.body(), requestBuffer) : ""));
            Response response = chain.proceed(request);
            /** DEBUG STUFF */

            //I am logging the response body in debug mode. When I do this I consume the response (OKHttp only lets you do this once) so i have re-build a new one using the cached body
            String bodyString = response.body().string();
            System.out.println(String.format("Sending request %s with headers %s ", request.url(), request.headers()));
            System.out.println(String.format("Got response HTTP %s %s \n\n with body %s \n\n ", response.code(), response.message(), bodyString));
            response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build();

            return response;
        }
    };

    @NonNull
    private static String _parseParams(RequestBody body, Buffer requestBuffer) throws UnsupportedEncodingException {
        if (body.contentType() != null && !body.contentType().toString().contains("multipart")) {
            return URLDecoder.decode(requestBuffer.readUtf8(), "UTF-8");
        }
        return "null";
    }
}

线程调度

public class SchedulersCompat {

    public static <T> ObservableTransformer<T, T> defaultSchedulers() {
        return new ObservableTransformer<T, T>() {
            @Override
            public ObservableSource<T> apply(Observable<T> upstream) {
                return upstream.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }


}

使用

public class DataManager {
    private static DataManager sInstance = new DataManager();

    private static AppApi mAppApi;
    private  String TAG="DEBUGDataManager";
    private Map<String,String> mDeviceSerialVerifyCodeMap = new HashMap<String,String>();
    public static DataManager getsInstance() {
        if (mAppApi == null) {
            mAppApi = RetrofitClient.getInstance().getAppApi();
        }

        return sInstance;
    }

    public Observable<BaseResponse<com.alibaba.fastjson.JSONObject>> appDelThresholds(String texts)
    {
        return mAppApi.appDelThresholds(texts).compose(SchedulersCompat.<BaseResponse<com.alibaba.fastjson.JSONObject>>defaultSchedulers());
    }
    

转换器工厂

public class ResponseConverterFactory extends Converter.Factory {

    public static ResponseConverterFactory create() {
        return create(new Gson());
    }


    public static ResponseConverterFactory create(Gson gson) {
        return new ResponseConverterFactory(gson);
    }

    private final Gson gson;

    private ResponseConverterFactory(Gson gson) {
        if (gson == null) throw new NullPointerException("gson == null");
        this.gson = gson;
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        //返回我们自定义的Gson响应体变换器
        return new GsonResponseBodyConverter<>(gson, type);
    }



}

转换器

public class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {

    private final Gson gson;
    private final Type type;


    public GsonResponseBodyConverter(Gson gson, Type type) {
        this.gson = gson;
        this.type = type;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {

        String response = value.string();
        //先将返回的json数据解析到Response中,如果code==200,则解析到我们的实体基类中,否则抛异常
        Response httpResponse = gson.fromJson(response, Response.class);
        if (httpResponse.getCode() == 200) {
            //正确的时候就直接解析,不可能出现解析异常。因为我们实体基类中传入的泛型,就是数据成功时候的格式
            return gson.fromJson(response, type);
        } else {
            //抛一个自定义ResultException
            throw new ResultException(httpResponse.getCode(), httpResponse.getMsg());
        }
    }
}

Response实体类

public class Response {
    private int code;
    private String msg;



    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

自定义异常

public class ResultException extends RuntimeException {
    private int errCode;
    private String msg;

    public ResultException(int errCode, String msg) {
        super();
        this.errCode = errCode;
        this.msg = msg;
    }
    public int getErrCode() {
        return errCode;
    }

    public String getMsg() {
        return msg;
    }

    @Override
    public String toString() {
        return msg;
    }

    @Override
    public String getMessage() {
        return msg;
    }
}

观察者

public abstract class BaseSubscriber<T extends BaseResponse> implements Observer<T> {

    private static final String TAG = "BaseSubscriber";

    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(T t) {

        onSuccess(t);
    }

    @Override
    public void onError(Throwable e) {
        Log.d(TAG, "onError: ");
        if (e.toString().equals("该账户不存在")) {
            ActivityUtils.startActivity(LoginActivity.class);
        }
        LogUtils.w("网络异常: " + e.toString());
        if (!NetUtils.isNetworkConnected(BaseApplication.getContext())) {
            onFail("请打开手机网络");
        } else if (e instanceof SocketTimeoutException || e instanceof TimeoutException) {
            onFail("网络请求超时,请检查您的网络状态");
        } else if (e instanceof ConnectException) {
            onFail("请求中断,请检查您的网络状态");
        } else if (e instanceof ResultException) {

            LogUtils.w("error == code!=200 code == " + ((ResultException) e).getErrCode());
            if (((ResultException) e).getErrCode() == 421) {
                ActivityUtils.startActivity(LoginActivity.class);
                BaseTimer.getInstans().killTimer();
                return;
            }
            if (((ResultException) e).getErrCode() == 401) {
                ActivityUtils.startActivity(LoginActivity.class);
                return;
            }
            onFail(((ResultException) e).getMsg());
        } else {
            onFail("" + e.getMessage());
        }
    }

    @Override
    public void onComplete() {

    }


    public abstract void onFail(String errorMsg);

    public abstract void onSuccess(T t);
}

网络状态工具类

public class NetUtils {

    public static enum NetType {
        WIFI, CMNET, CMWAP, NONE
    }

    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] info = mgr.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean isNetworkConnected(Context context) {
        try {

            if (context != null) {
                ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
                if (mNetworkInfo != null) {
                    return mNetworkInfo.isAvailable();
                }
            }
        } catch (Exception e) {
            LogUtils.w(e.toString());
            return false;
        }
        return false;
    }

    public static boolean isWifiConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (mWiFiNetworkInfo != null) {
                return mWiFiNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    public static boolean isMobileConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mMobileNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if (mMobileNetworkInfo != null) {
                return mMobileNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    public static int getConnectedType(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
                return mNetworkInfo.getType();
            }
        }
        return -1;
    }

    public static NetType getAPNType(Context context) {
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo == null) {
            return NetType.NONE;
        }
        int nType = networkInfo.getType();

        if (nType == ConnectivityManager.TYPE_MOBILE) {
            if (networkInfo.getExtraInfo().toLowerCase(Locale.getDefault()).equals("cmnet")) {
                return NetType.CMNET;
            } else {
                return NetType.CMWAP;
            }
        } else if (nType == ConnectivityManager.TYPE_WIFI) {
            return NetType.WIFI;
        }
        return NetType.NONE;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值