RetrofitRxJava

几个月前单位的一个项目,说要在项目中实现修改域名地址然后请求接口,当时我还问了句,那接口还能用? 后来解释说在本地有一个服务器,把资源传到本地的服务器,然后在本地请求,也就是相当与下面这样的地址

http://公司域名/api/接口地址    // 正常的接口地址

http://192.168.1.176:88/api/接口地址     // 修改后的接口地址   有可能是用户自己输入的

输入本地的 ip 地址 还有端口号 然后加上接口地址请求本地的资源

然后也看了同事的代码,发现里面并不能修改地址,甚至连接口类都不能更改,这个发现顿时头都大了,当时自己还在想 这啥都不能改,封装这个请求有什么用。

但是公司有需求,还是得实现啊,然后就有了下面的代码

/**
     * 获取本地ip地址
     */
    private static String getServerUrl() {
        String baseUrl = SERVER_URL;
        String serviceUrl = SPUtils.getInstance(BASE_URL).getString(BASE_URL);
        if (!StringUtils.isEmpty(serviceUrl)) {
            baseUrl = serviceUrl;
        }
        return baseUrl;
    }

获取用户输入的IP地址或者修改的地址然后配置Retrofit

private RetrofitFactory() {
        mOkHttpClientBuilder = new OkHttpClient.Builder();
        /**
         * 设置缓存
         */
        File cacheFile = new File(App.getContext().getExternalCacheDir(), CACHE_NAME);
        Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);
        mOkHttpClientBuilder.cache(cache);
        mOkHttpClientBuilder.addInterceptor(new CacheInterceptor());
        // 设置超时时间
        mOkHttpClientBuilder.connectTimeout(DEFAULT_CONNECT_TIMEOUT, TimeUnit.SECONDS);
        mOkHttpClientBuilder.readTimeout(DEFAULT_READ_TIMEOUT, TimeUnit.SECONDS);
        mOkHttpClientBuilder.writeTimeout(DEFAULT_WRITE_TIMEOUT, TimeUnit.SECONDS);
        mOkHttpClientBuilder.retryOnConnectionFailure(true); // 连接失败时重试
        // 添加日志拦截器
        mOkHttpClientBuilder.addInterceptor(loggingInterceptor());
        // 添加头部拦截器
        mOkHttpClientBuilder.addInterceptor(new HeadersInterceptor());
        mOkHttpClient = mOkHttpClientBuilder.build();
        changeBaseUrl(getServerUrl());
    }

   /**
     * APi接口服务类
     */
    public  T create(Class service) {
        return mRetrofit.create(service);
    }

   /**
     * 改变baseUrl
     */
    public void changeBaseUrl(String baseUrl) {
        mRetrofit = new Retrofit.Builder()
                .client(mOkHttpClient)
                .addConverterFactory(GsonConverterFactory.create(StringTypeGson()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(baseUrl)
                .build();
    }

/**
     * 支持自己定义事件处理
     * 设置订阅 和 所在的线程环境
     */
    public  void toSubscribe(Observable observable, BaseObserver baseObserver) {
        observable.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(baseObserver);
    }

调用的几种方式

        Map params = new HashMap<>();
        params.put("userToken", "c5472bd21ea71229d3e6de99d656affd");
        // **********第一种请求
        RetrofitManager.getInstance().postData(url, params, BaseResponse.class, new BaseObserver() {
            @Override
            public void onSucceed(BaseResponse result) {
                ToastUtils.showToast("----成功了");
                tv_review_result_review_loan.setText("请求成功了");
            }

            @Override
            public void onFailed(int code, String msg) {
                ToastUtils.showToast("----失败了");
                tv_review_result_review_loan.setText("请求失败了");
            }
        });

        // **********第二种请求
        RetrofitManager.toSubscribe(RetrofitManager.getInstance()
                .create(ApiService.class)
                .getBaseResponse(params), new BaseObserver() {
            @Override
            public void onSucceed(BaseResponse result) {
                ToastUtils.showToast("----成功了");
                tv_review_result_review_loan.setText("请求成功了");
            }

            @Override
            public void onFailed(int code, String msg) {
                ToastUtils.showToast("----失败了");
                tv_review_result_review_loan.setText("请求失败了");
            }
        });

        // **********第三种请求
        RetrofitManager.getInstance()
                .create(ApiService.class)
                .getBaseResponse(params)
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        // 下面的用一种就可以
                        new BaseObserver() {
                            @Override
                            public void onSucceed(BaseResponse result) {
                                ToastUtils.showToast("----成功了");
                                tv_review_result_review_loan.setText("请求成功了");
                            }

                            @Override
                            public void onFailed(int code, String msg) {
                                ToastUtils.showToast("----失败了");
                                tv_review_result_review_loan.setText("请求失败了");
                            }
                        }
//                        new Observer() {
//                    @Override
//                    public void onSubscribe(Disposable d) {
//
//                    }
//
//                    @Override
//                    public void onNext(BaseResponse homeBean) {
//                        ToastUtils.showToast("----成功了");
//                        tv_review_result_review_loan.setText("请求成功了");
//                    }
//
//                    @Override
//                    public void onError(Throwable e) {
//                        ToastUtils.showToast("----失败了");
//                        tv_review_result_review_loan.setText("请求失败了");
//                    }
//
//                    @Override
//                    public void onComplete() {
//
//                    }
//                }
                );

可以任意选一中

如果有更好的封装请@我,我也想学习学习

地址:https://github.com/xiaobinAndroid421726260/Android_RetrofitRxJava_Dome_2019_04_22.git

你可能感兴趣的:(RetrofitRxJava)