Android Retrofit2和Rxjava2的使用

添加依赖

    api "io.reactivex.rxjava2:rxjava:2.1.0" // 必要rxjava2依赖
    api "io.reactivex.rxjava2:rxandroid:2.0.1" // 必要rxandrroid依赖,切线程时需要用到
    api 'com.squareup.retrofit2:retrofit:2.3.0' // 必要retrofit依赖
    api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' // 必要依赖,和Rxjava结合必须用到,下面会提到
    api 'com.squareup.retrofit2:converter-gson:2.3.0' // 必要依赖,解析json字符所用
    api 'com.squareup.okhttp3:logging-interceptor:3.8.1' //非必要依赖, log依赖,如果需要打印OkHttpLog需要添加

编写Retrofit工具类

  • 编写单例模式
  • 编写日志拦截器
  • 使用OkHttoClient配置网络请求相关信息
  • 添加Rxjava监听数据返回
  • 添加Gson转换器
   package com.weiqun.cherytelematic.network;

import com.weiqun.cherytelematic.BuildConfig;

import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * @author DcotorWei
 * @date :2019/11/25 10:09
 * @description :TODO
 * @email :1348172474@qq.com
 */
public class RetrifitUtil {
    private static RetrifitUtil retrifitUtil;
    public static RetrifitUtil getInstance() {
        if (retrifitUtil == null) {
            synchronized (RetrifitUtil.class) {
                if (retrifitUtil == null) {
                    retrifitUtil = new RetrifitUtil();
                }
            }
        }
        return retrifitUtil;
    }
    public Retrofit getRetrofit(String baseUrl){
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//返回Observer对象
                .addConverterFactory(GsonConverterFactory.create())//将Observer对象转化成相应的实体
                .client(getOkHttpClient())
                .build();
        return retrofit;
    }
    private OkHttpClient getOkHttpClient(){
        OkHttpClient okHttpClient=new OkHttpClient.Builder()
                .readTimeout(10000, TimeUnit.SECONDS)
                .writeTimeout(10000,TimeUnit.SECONDS)
                .connectTimeout(10000,TimeUnit.SECONDS)
                .addNetworkInterceptor(getIntercepter())//添加日志拦截器
                .build();
        return okHttpClient;
    }
    private Interceptor getIntercepter(){
        HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor();
        interceptor.setLevel(BuildConfig.DEBUG?HttpLoggingInterceptor.Level.BODY:HttpLoggingInterceptor.Level.NONE);
        return interceptor;
    }

}

编写api

api:此处使用百度错误的api,请自行配置

  /**
 * @author DcotorWei
 * @date :2019/11/25 10:42
 * @description :API接口文档
 * @email :1348172474@qq.com
 */
public interface CheryApi {
    String BASE_URL="http://cloudrive.baidu.cn/baidu/app/";
    String LOGIN="login";
}

编写请求实体类

实体类:
请求实体类可以自行配置
响应实体可以自行配置

package com.weiqun.cherytelematic.bean;

/**
 * @author DcotorWei
 * @date :2019/11/25 8:52
 * @description :TODO
 * @email :1348172474@qq.com
 */
public class UserBean {
    /**
     * version : 版本号
     * businessId :
     * serviceType :
     * globalId : 登录时可以传空字符串
     * requestId : 请求id
     * login : {"userAccount":"登录账号","userPasswd":"登录密码"}
     */

    private String version;
    private String businessId;
    private String serviceType;
    private String globalId;
    private String requestId;
    private LoginBean login;

    public UserBean(String version, String businessId, String serviceType, String globalId, String requestId, LoginBean login) {
        this.version = version;
        this.businessId = businessId;
        this.serviceType = serviceType;
        this.globalId = globalId;
        this.requestId = requestId;
        this.login = login;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getBusinessId() {
        return businessId;
    }

    public void setBusinessId(String businessId) {
        this.businessId = businessId;
    }

    public String getServiceType() {
        return serviceType;
    }

    public void setServiceType(String serviceType) {
        this.serviceType = serviceType;
    }

    public String getGlobalId() {
        return globalId;
    }

    public void setGlobalId(String globalId) {
        this.globalId = globalId;
    }

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public LoginBean getLogin() {
        return login;
    }

    public void setLogin(LoginBean login) {
        this.login = login;
    }

    public static class LoginBean {
        public LoginBean() {
        }

        public LoginBean(String userAccount, String userPasswd) {
            this.userAccount = userAccount;
            this.userPasswd = userPasswd;
        }

        /**
         * userAccount : 登录账号
         * userPasswd : 登录密码
         */

        private String userAccount;
        private String userPasswd;

        public String getUserAccount() {
            return userAccount;
        }

        public void setUserAccount(String userAccount) {
            this.userAccount = userAccount;
        }

        public String getUserPasswd() {
            return userPasswd;
        }
        public void setUserPasswd(String userPasswd) {
            this.userPasswd = userPasswd;
        }
    }
}

package com.weiqun.cherytelematic.bean.res;

import com.weiqun.cherytelematic.bean.BaseBean;

/**
 * @author DcotorWei
 * @date :2019/11/25 10:48
 * @description :TODO
 * @email :1348172474@qq.com
 */
public class LoginRes extends BaseBean {

    /**
     * userInfo : {"username":"1064611374687","password":"123456","email":null,"vin":"LVVDC17B2HD186057"}
     * vehicleInfo : {"vin":"LVVDC17B2HD186057","licenseNum":null,"vehicleType":"M1AEV","vehicleStyle":null,"iccid":"89860616010055022236"}
     * versionInfo : {"versionFlag":"","newVersion":"","versionRemark":"","versionUrl":""}
     * configInfo : {"pollInterval":600,"controlPollInterval":5,"timeout":105}
     * version : ver2.4.114
     * businessId : 100
     * serviceType : 601
     * globalId : 76a966b0-1dfd-4a4c-b640-82473581af35
     * resultCode : 0200
     */

    private UserInfoBean userInfo;
    private VehicleInfoBean vehicleInfo;
    private VersionInfoBean versionInfo;
    private ConfigInfoBean configInfo;
    private String version;
    private String businessId;
    private String serviceType;
    private String globalId;
    private String resultCode;

    public UserInfoBean getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(UserInfoBean userInfo) {
        this.userInfo = userInfo;
    }

    public VehicleInfoBean getVehicleInfo() {
        return vehicleInfo;
    }

    public void setVehicleInfo(VehicleInfoBean vehicleInfo) {
        this.vehicleInfo = vehicleInfo;
    }

    public VersionInfoBean getVersionInfo() {
        return versionInfo;
    }

    public void setVersionInfo(VersionInfoBean versionInfo) {
        this.versionInfo = versionInfo;
    }

    public ConfigInfoBean getConfigInfo() {
        return configInfo;
    }

    public void setConfigInfo(ConfigInfoBean configInfo) {
        this.configInfo = configInfo;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getBusinessId() {
        return businessId;
    }

    public void setBusinessId(String businessId) {
        this.businessId = businessId;
    }

    public String getServiceType() {
        return serviceType;
    }

    public void setServiceType(String serviceType) {
        this.serviceType = serviceType;
    }

    public String getGlobalId() {
        return globalId;
    }

    public void setGlobalId(String globalId) {
        this.globalId = globalId;
    }

    public String getResultCode() {
        return resultCode;
    }

    public void setResultCode(String resultCode) {
        this.resultCode = resultCode;
    }

    public static class UserInfoBean {
        /**
         * username : 1064611374687
         * password : 123456
         * email : null
         * vin : LVVDC17B2HD186057
         */

        private String username;
        private String password;
        private Object email;
        private String vin;

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public Object getEmail() {
            return email;
        }

        public void setEmail(Object email) {
            this.email = email;
        }

        public String getVin() {
            return vin;
        }

        public void setVin(String vin) {
            this.vin = vin;
        }
    }

    public static class VehicleInfoBean {
        /**
         * vin : LVVDC17B2HD186057
         * licenseNum : null
         * vehicleType : M1AEV
         * vehicleStyle : null
         * iccid : 89860616010055022236
         */

        private String vin;
        private Object licenseNum;
        private String vehicleType;
        private Object vehicleStyle;
        private String iccid;

        public String getVin() {
            return vin;
        }

        public void setVin(String vin) {
            this.vin = vin;
        }

        public Object getLicenseNum() {
            return licenseNum;
        }

        public void setLicenseNum(Object licenseNum) {
            this.licenseNum = licenseNum;
        }

        public String getVehicleType() {
            return vehicleType;
        }

        public void setVehicleType(String vehicleType) {
            this.vehicleType = vehicleType;
        }

        public Object getVehicleStyle() {
            return vehicleStyle;
        }

        public void setVehicleStyle(Object vehicleStyle) {
            this.vehicleStyle = vehicleStyle;
        }

        public String getIccid() {
            return iccid;
        }

        public void setIccid(String iccid) {
            this.iccid = iccid;
        }
    }

    public static class VersionInfoBean {
        /**
         * versionFlag :
         * newVersion :
         * versionRemark :
         * versionUrl :
         */

        private String versionFlag;
        private String newVersion;
        private String versionRemark;
        private String versionUrl;

        public String getVersionFlag() {
            return versionFlag;
        }

        public void setVersionFlag(String versionFlag) {
            this.versionFlag = versionFlag;
        }

        public String getNewVersion() {
            return newVersion;
        }

        public void setNewVersion(String newVersion) {
            this.newVersion = newVersion;
        }

        public String getVersionRemark() {
            return versionRemark;
        }

        public void setVersionRemark(String versionRemark) {
            this.versionRemark = versionRemark;
        }

        public String getVersionUrl() {
            return versionUrl;
        }

        public void setVersionUrl(String versionUrl) {
            this.versionUrl = versionUrl;
        }
    }

    public static class ConfigInfoBean {
        /**
         * pollInterval : 600
         * controlPollInterval : 5
         * timeout : 105
         */

        private int pollInterval;
        private int controlPollInterval;
        private int timeout;

        public int getPollInterval() {
            return pollInterval;
        }

        public void setPollInterval(int pollInterval) {
            this.pollInterval = pollInterval;
        }

        public int getControlPollInterval() {
            return controlPollInterval;
        }

        public void setControlPollInterval(int controlPollInterval) {
            this.controlPollInterval = controlPollInterval;
        }

        public int getTimeout() {
            return timeout;
        }

        public void setTimeout(int timeout) {
            this.timeout = timeout;
        }
    }
}

编写网络返回管理类

  • 请求开始progressbar
  • 处理返回成功的数据
  • 遇到错误的情况(404或网络异常)
  • 完成销毁progressbar
package com.weiqun.cherytelematic.network;
import android.accounts.NetworkErrorException;
import com.dejun.commonsdk.base.BaseActivity;
import com.dejun.commonsdk.dialog.ProgressDialogFragment;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.util.concurrent.TimeoutException;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
 * @author DcotorWei
 * @date :2019/11/25 11:24
 * @description :TODO
 * @email :1348172474@qq.com
 */
public abstract class BaseObserver<T> implements Observer<T> {
    protected BaseActivity mContext;
    private ProgressDialogFragment progressDialogFragment;
    private String labelTxt;

    public BaseObserver(BaseActivity cxt, String text) {
        this.mContext = cxt;
        this.labelTxt = text;
        if (progressDialogFragment == null) {
            progressDialogFragment = ProgressDialogFragment.newInstance(text);
        }
        progressDialogFragment.show(cxt.getSupportFragmentManager(), getClass().getSimpleName());
    }

    public BaseObserver(BaseActivity cxt) {
        this(cxt, "");
    }

    //开始
    @Override
    public void onSubscribe(Disposable d) {
        onRequestStart();
    }

    //成功获取数据
    @Override
    public void onNext(T res) {
        try {
            onSuccees(res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取数据失败
    @Override
    public void onError(Throwable e) {
        onRequestEnd();
        try {
            if (e instanceof ConnectException
                    || e instanceof TimeoutException
                    || e instanceof NetworkErrorException
                    || e instanceof UnknownHostException) {
                onFailure(e, true);  //网络错误
            } else {
                onFailure(e, false);
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    //结束
    @Override
    public void onComplete() {
        onRequestEnd();//请求结束
    }

    /**
     * 返回成功
     *
     * @param t
     * @throws Exception
     */
    public abstract void onSuccees(T t) throws Exception;


    /**
     * 返回失败
     *
     * @param e
     * @param isNetWorkError 是否是网络错误
     * @throws Exception
     */
    public abstract void onFailure(Throwable e, boolean isNetWorkError) throws Exception;

    public void onRequestStart() {
        if (labelTxt != null && progressDialogFragment != null) {
            progressDialogFragment.setText(labelTxt);
        }
    }

    public void onRequestEnd() {
        if (progressDialogFragment != null) {
            progressDialogFragment.dismiss();
            progressDialogFragment = null;
        }
    }

}

使用

  • 添加子线程的网络请求
  • 切换成主线程
  • 添加返回监听
package com.weiqun.cherytelematic.activity;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.dejun.commonsdk.base.BaseActivity;
import com.gyf.barlibrary.ImmersionBar;
import com.orhanobut.logger.Logger;
import com.weiqun.cherytelematic.CheryApi;
import com.weiqun.cherytelematic.R;
import com.weiqun.cherytelematic.bean.UserBean;
import com.weiqun.cherytelematic.bean.res.LoginRes;
import com.weiqun.cherytelematic.databinding.ActivityLoginBinding;
import com.weiqun.cherytelematic.network.BaseObserver;
import com.weiqun.cherytelematic.network.RetrifitUtil;
import com.weiqun.cherytelematic.service.LoginService;
import java.util.UUID;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

public class LoginActivity extends BaseActivity implements View.OnClickListener {
    ActivityLoginBinding activityLoginBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ImmersionBar.with(this).init();
        activityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login);
        activityLoginBinding.setOnClickListener(this);
        //修改登录界面
        activityLoginBinding.setLoginBean(new UserBean.LoginBean("1064611374687", "123456"));
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        if (id == R.id.btn_login) {
            UserBean.LoginBean loginBean = new UserBean.LoginBean("DoctorWei", "123456");
            UserBean userBean = new UserBean("ver2.4.114", UUID.randomUUID() + "", "601", "", "a903bbf3-edee-4dad-b5eb-7f86c94c2a39", loginBean);
            RetrifitUtil.getInstance()
                    .getRetrofit(CheryApi.BASE_URL)
                    .create(LoginService.class)
                    //添加请求体
                    .login(userBean)
                    //subscribeOn()主要改变的是订阅的线程,切换到线程池中的子线程,即call()执行的线程,用于网络请求
                    .subscribeOn(Schedulers.io())
                    //observeOn()主要改变的是发送的线程,即onNext()执行的线程,切换成主线程,进行UI的修改
                    .observeOn(AndroidSchedulers.mainThread())
                    //处理回调数据
                    .subscribe(new BaseObserver<LoginRes>(LoginActivity.this,"") {
                        @Override
                        public void onSuccees(LoginRes loginRes) throws Exception {
                            Logger.d(loginRes);
                        }

                        @Override
                        public void onFailure(Throwable e, boolean isNetWorkError) throws Exception {
                            if (isNetWorkError){
                                Toast.makeText(LoginActivity.this,"网络异常",Toast.LENGTH_SHORT);
                            }else{
                                Logger.e(e.getMessage());
                            }
                        }
                    });

        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OkHttp 是一个用于网络请求的开源库,它可以提高网络请求的性能。Retrofit 是一个基于 OkHttp 的网络请求库,它可以简化网络请求的代码。RxJava 是一个用于在 AndroidJava 应用程序中进行响应式编程的库。Retrofit2RxJava2 可以结合使用,以提高网络请求的性能和代码的可读性。 ### 回答2: OkHttp、Retrofit2RxJava2是Android开发中很重要的三个框架。 OkHttp是一个开源的HTTP客户端,使用Java语言开发,支持HTTP/2、SPDY、连接池、缓存等特性。它不仅对Android平台友好,也能在Java虚拟机上运行。OkHttp在网络请求方面表现出色,非常适合于用来处理HTTP请求,它提供了很多重要的功能,例如请求和响应拦截器、响应缓存、连接池和数据压缩等。同时,OkHttp还支持多种网络协议,包括HTTP1/2,SPDY,WS等。 Retrofit2是一个RESTful风格的网络请求库,用于对HTTP请求进行封装和处理。在Retrofit2中,我们可以定义各种接口,使用注解来描述请求和响应,并通过相应的注解来指定请求方式、路径、请求参数等信息。Retrofit2底层依赖OkHttp,两者配合使用效果更佳。Retrofit2支持Gson、Jackson等多种序列化和反序列化的格式,同时支持RxJava2,可以方便地实现异步处理和请求合并。 RxJava2是一个响应式编程库,通过将异步事件传输和不同线程之间切换的过程进行抽象封装,提供了一种更易用的处理异步任务的方式。通过RxJava2,我们可以很方便地处理数据同步、异步以及UI线程和后台线程之间的切换等问题。RxJava2还支持丰富的操作符,例如map、filter等操作符,可以让我们更加方便地处理数据。在Android项目中,我们可以通过RxJava2和Retrofit2配合使用,从而更加优雅地实现异步请求数据的过程。 总的来说,OkHttp、Retrofit2RxJava2是Android开发中必不可少的三个框架。OkHttp用于网络通信,Retrofit2用于请求数据,而RxJava2用于方便处理异步任务,三者之间相互配合可以极大地提高开发效率和代码质量。 ### 回答3: OkHttp是一个网络请求库,支持HTTP/2和HTTP/1.x协议,可以替代原生HttpURLConnection,具有更好的性能和可扩展性。OkHttp具有强大的请求和响应拦截器,可以轻松地添加自定义头部、日志打印、缓存、重试等功能。 Retrofit2是基于OkHttp封装的一个RESTful API调用库,提供了简洁的API和强大的插件扩展机制。Retrofit2的设计是根据Java注解进行的,通过注解来定义请求的URL,请求的方法,方法参数等,使得代码更加简洁易懂。Retrofit2还支持按需解析响应数据,内置了多种数据解析器,如Gson和Jackson等。 RxJava2是一个函数式编程库,可以方便地实现异步编程和事件流处理。它通过使用Observables和Subscribers以及操作符,使得异步编程更加优雅和易于扩展。在Retrofit2中结合RxJava2使用可以实现更加高效、清晰和方便的异步网络请求和数据处理。 综上所述,OkHttp、Retrofit2RxJava2联合使用可以实现优秀的网络请求和数据处理的功能,使得代码更加简洁、易于扩展和优化。它们的组合可以为开发者提供更好的开发体验,以及更好的满足现代App对网络请求和数据处理的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值