retrofit的基本使用

retrofit的初步使用

本篇文章从一个角度说明为什么retrofit会搭配rxjava一起使用

一.定义请求接口

/**
 * 使用get请求
 * @Get(网址)方法参数:网址中需要的参数
 */
public interface IRetrofitResult {

    @GET("/nc/article/headline/T1348647853363/0-40.html")
    Call<ResponseBody> getInfo();

    //观察者
    @GET("/nc/article/headline/T1348647853363/0-40.html")
    Observable<Bean> getBean();
}

二.封装retrofit工具类

/**
 * 使用retrofit框架下载数据
 */
public class RetrofitUtils {

    IOKgoResult<Response<ResponseBody>> result;
    IOKgoResult<Bean> result2;

    public void setResult(IOKgoResult<Response<ResponseBody>> result){
        this.result = result;
    }

    public void setResult2(IOKgoResult<Bean> result2){
        this.result2 = result2;
    }

    /**
     * retrofit底层封装了OKHttp框架,真正的下载还是由OKHttp来实现
     * 说明:使用enqueue()实现异步下载
     */
    public void getStr(){

        OkHttpClient client = new OkHttpClient.Builder().build();

        Retrofit rbuilder = new Retrofit.Builder()
        .baseUrl(Strings.BASE_URL)
        .client(client).build();

        IRetrofitResult retrofitResult = rbuilder.create(IRetrofitResult.class);
        Call<ResponseBody> info = retrofitResult.getInfo();
        info.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                result.getResult(response);
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
    }

    /**
     * 使用retrofit执行下载,调用execute()执行同步请求
     * 没有rxjava的时候,如果使用retrofit同步方式下载会报错
     * 解决方式:1.new Thread
     *         2.使用Rxjava
     */
    public void getStr_tongbu(){

        OkHttpClient client = new OkHttpClient.Builder().build();

        Retrofit retrofit = new Retrofit.Builder().
                client(client)
                .baseUrl(Strings.BASE_URL)
                .build();

        IRetrofitResult retrofitResult = retrofit.create(IRetrofitResult.class);

        Response<ResponseBody> bodyResponse;

        try {
            bodyResponse = retrofitResult.getInfo().execute();
            result.getResult(bodyResponse);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用retrofit同步+rxjava
     */
    public void rxjavaTest(){

        OkHttpClient client = new OkHttpClient.Builder().build();

        Retrofit retrofit = new Retrofit.Builder().
                client(client)
                .baseUrl(Strings.BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        IRetrofitResult retrofitResult = retrofit.create(IRetrofitResult.class);

        //被观察者
        Observable<Bean> observable = retrofitResult.getBean();
        //被观察者订阅观察者(Observer是观察者)
        /**
         * 观察者创建的两种方式
         * 方式一:new Observer
         * 方式二:new Subscriber
         * 区别:底层是将方式一转换为方式二执行,并且方式二新增onStart()方法
         */
//        observable.subscribe(new Observer<ResponseBody>() {
//            @Override
//            public void onCompleted() {
//
//            }
//
//            @Override
//            public void onError(Throwable e) {
//
//            }
//
//            @Override
//            public void onNext(ResponseBody responseBody) {
//
//            }
//        });

//        observable
//                .observeOn(AndroidSchedulers.mainThread())
//                .subscribeOn(Schedulers.io())
//                .subscribe(new Subscriber<Bean>() {
//            @Override
//            public void onCompleted() {
//
//            }
//
//            @Override
//            public void onError(Throwable e) {
//
//            }
//
//            @Override
//            public void onNext(Bean responseBody) {
//                result2.getResult(responseBody);
//            }
//        });

        /**
         * 观察者中的方法可以使用Action对象来单独处理
         * subscribe()
         */
        //处理next方法
        Action1<Bean> onNext = new Action1<Bean>() {
            @Override
            public void call(Bean bean) {
                result2.getResult(bean);
            }
        };

        //处理异常的对象
        Action1<Throwable> error = new Action1<Throwable>() {
            @Override
            public void call(Throwable e) {
                Log.d("amy",e.getMessage());
            }
        };

        observable
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribe(onNext,error);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值