Retrofit+OkHttp+RxJava的正确使用方式

引入包

//retrofit
    compile 'com.squareup.retrofit2:retrofit:2.2.0'
    compile 'com.squareup.retrofit2:converter-gson:2.2.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    compile 'com.squareup.okio:okio:1.5.0'
    //rxjava
    compile 'io.reactivex:rxjava:1.2.0'
    compile 'io.reactivex:rxandroid:1.2.1'

定义订阅者

/**
 * Created by 87901 on 2016/5/5.
 * RxJava中的订阅者
 */
public class BaseSubscriber<T> extends Subscriber<T> {
    private Context context;
    public BaseSubscriber(Context context){
        this.context=context;
    }
    @Override
    public void onStart() {
    }
    @Override
    public void onNext(T t) {
        Toast.makeText(context, ((BaseBean) t).msg,Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onCompleted() {
    }
    @Override
    public void onError(Throwable throwable) {
        try {
            Toast.makeText(context, "网络错误",Toast.LENGTH_SHORT).show();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

定义Http请求类

public class HttpHelp {

    private static Retrofit instance;
    private HttpHelp(){}
    /**
     * 不需要在请求头添加东西,可以做成单例模式
     * @return
     */
    public static Retrofit getInstance(){
        if (instance==null){
            synchronized (HttpHelp.class){
                if (instance==null){
                    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
                    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                    OkHttpClient client = new OkHttpClient.Builder()
                            .addInterceptor(interceptor)
                            .retryOnConnectionFailure(true)
                            .connectTimeout(5, TimeUnit.SECONDS)
                            .readTimeout(600,TimeUnit.SECONDS)
                            .writeTimeout(600,TimeUnit.SECONDS)
                            .build();

                    Gson gson = new GsonBuilder()
                            .setLenient()
                            .create();
                    instance = new Retrofit.Builder()
                            .baseUrl(Constants.HOST)
                            .client(client)
                            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                            .addConverterFactory(GsonConverterFactory.create(gson))
                            .build();
                }
            }
        }
        return instance;
    }
}

定义接口

public interface RemoteApi {
    //获取热门城市
    @GET("search/hots")
    Observable<BaseBean<Object>> getHotSearchData();
    //登录
    @POST("/api/user/login")
    @FormUrlEncoded
    Observable<BaseBean<LoginBean>> login(@Field("username") String username, @Field("password") String password);
    ...
}

调用

HttpHelp.getInstance().create(RemoteApi.class).login(etPhoneNumber.getText().toString().trim()
                            ,etPassword.getText().toString().trim())
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new BaseSubscriber<BaseBean<LoginBean>>(LoginActivity.this) {
                                @Override
                                public void onNext(BaseBean<LoginBean> baseBean) {
                                    super.onNext(baseBean);
                                    //处理请求成功后的业务逻辑
                                }
                               @Override
                                public void onError(Throwable throwable) {
                                    super.onError(throwable);
                                   //请求异常
                                }
                            });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,879评论 1 45
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,995评论 0 15
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,248评论 6 13
  • 今天我学习了《棉花姑娘》这一课,写的是棉花姑娘生病了,他让燕子、啄木鸟和青蛙帮她捉害虫,可是他们都治不了棉...
    李淑洁阅读 1,453评论 0 0