Retrofit+RxJava

Retrofit

Retrofit2的简述

Retrofit其实我们可以理解为OkHttp的加强版,它也是一个网络加载框架。
底层是使用OKHttp封装的。准确来说,网络请求的工作本质上是OkHttp完成,
而 Retrofit 仅负责网络请求接口的封装。它的一个特点是包含了特别多注解,
方便简化你的代码量。并且还支持很多的开源库(著名例子:Retrofit + RxJava)。
Retrofit和OkHttp都是square公司开发的。
https://square.github.io/retrofit/

Retrofit注解

在这里插入图片描述

String url_get = "http://gank.io/api/";
String url_post = "http://yun918.cn/study/public/index.php/";
String url_query = "https://www.wanandroid.com/";
String url_body = "https://www.wanandroid.com/";
String url_headers = "https://cdwan.cn/api/";

//get
@GET("data/%E7%A6%8F%E5%88%A9/20/2")
Call<GetBean> getData();

//post
@POST("data/%E7%A6%8F%E5%88%A9/20/2")
Call<GetBean> getData2();

//field
@POST("register")
@FormUrlEncoded
Call<PostBean> getData3(@Field("username") String username,
                        @Field("password") String password,
                        @Field("phone") String phone,
                        @Field("verify") String verify);

//query
@GET("project/list/1/json")
Call<QueryBean> getData4(@Query("cid") int cid);

//fieldMap
@POST("register")
@FormUrlEncoded
Call<PostBean> getData5(@FieldMap Map<String, String> map);

//queryMap
@GET("project/list/1/json?")
Call<QueryBean> getData6(@QueryMap Map<String, Object> map);

//body
@POST("user/login")
Call<BodyBean> getData7(@Body RequestBody requestBody);

//path
@GET("data/%E7%A6%8F%E5%88%A9/20/{page}")
Call<GetBean> getData8(@Path("page") int page);

//url
@GET
Call<GetBean> getData9(@Url String url_query);

//headers
@POST("cart/add")
@FormUrlEncoded
@Headers("X-Nideshop-Token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo1LCJpYXQiOjE1ODMxNjgzMDB9.aqdQNPdW8anMSqaqfAGWNPZxbb6j39tAaV-fOuzNhUM")
Call<CartBean> getData10(@Field("goodsId") String goodsId,
                             @Field("number") String number,
                             @Field("productId") String productId);

//header
@POST("cart/add")
@FormUrlEncoded
Call<CartBean> getData11(@Header("X-Nideshop-Token") String header);

Retrofit案例

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("")
                .build();

        LoadJson json = retrofit.create(LoadJson.class);
        Call<ResponseBody> call = json.loadJsonStr();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String result = response.body().string();
                    Log.d("amy", "onResponse: "+result);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.d("amy", "onFailure: "+t.getMessage());
            }
        });

RxJava

相关概念

观察者:Observer;
被观察者:Observable;
订阅(或注册):subscribe()

案例:
观察者:OnClickListener;
被观察者:Button;
订阅(或注册):setOnClickListener()

被观察者Observable的创建方式

1.create
Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for(int i = 0;i<10;i++){
                    subscriber.onNext(i);
                }
                subscriber.onCompleted();
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                Log.d("amy", "onCompleted:");
            }

            @Override
            public void onError(Throwable e) {
                Log.d("amy", "onError:");
            }

            @Override
            public void onNext(Integer s) {
                Log.d("amy", "onNext: "+s);
            }
        });

案例中,数据是在call方法中循环的。如果已经有集合对象则可以使用from方法来创建Observable。其中just方法中可以放对象(T t);

2.from
Observable.from(integers).subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                Log.d("amy", "onCompleted: "+integers.size());
            }
            @Override
            public void onError(Throwable e) {
                Log.d("amy", "onError: ");
            }
            @Override
            public void onNext(Integer integer) {
                Log.d("amy", "onNext: "+integer);
            }
        });
3.just
Observable.just(integers).subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                Log.d("amy", "onCompleted: "+integers.size());
            }
            @Override
            public void onError(Throwable e) {
                Log.d("amy", "onError: ");
            }
            @Override
            public void onNext(Integer integer) {
                Log.d("amy", "onNext: "+integer);
            }
        });

订阅者Observer的创建

1.new Observer:同时重写onNext、onError、onCompleted
.subscribe(new Observer<List<String>>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(List<String> strings) {

                    }
                })
2.new ActionX:选择重写其中某个或某些方法

使用Action,Action1表示onNext,onError,Action0表示onCompleted。subscribe方法的添加顺序:依次为onNext,onError,onCompleted

.subscribe(new Action1<List<String>>() { //next
            @Override
            public void call(List<String> strings) {
                Log.d("amy", "onNext: "+strings);
            }
        }, new Action1<Throwable>() {   //error
            @Override
            public void call(Throwable throwable) {
                Log.d("amy", "onError: "+throwable.getMessage());
            }
        }, new Action0() {   //onCompleted
            @Override
            public void call() {
                Log.d("amy", "onCompleted: ");
            }
        });

常见操作符

map

用于类型转换,其中用于FuncX,funcX带返回值而ActionX不带返回值。

        //多次使用map,想用几个用几个
        Observable.just("Hello", "World")
                .map(new Func1<String, Integer>() {//将String类型的转化为Integer类型的哈希码
                    @Override
                    public Integer call(String s) {
                        return s.hashCode();
                    }
                })
                .map(new Func1<Integer, String>() {//将转化后得到的Integer类型的哈希码再转化为String类型
                    @Override
                    public String call(Integer integer) {
                        return integer.intValue() + "";
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });
Scheduler:线程控制器
    private void rxJavaTest3() {
        Observable.just("Hello", "Word")
                .subscribeOn(Schedulers.newThread())//指定 subscribe() 发生在新的线程
                .observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回调发生在主线程
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });
filter:集合进行过滤
 /**
         * 过滤大于2的数字,并做类型转换
         */
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for(int i = 0;i<10;i++){
                    subscriber.onNext(i);
                }
                subscriber.onCompleted();
            }
        }).filter(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                if(integer < 2)
                    return true;
                else
                    return false;

                // return true; //全部通过
            }
        }).map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return integer+"-- string";
                    }
                })
                .subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.d("amy", "onCompleted: ");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String integer) {
                Log.d("amy", integer);
            }
        });
each:遍历集合
take:取出集合中的前几个
skip:跳过前几个元素
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值