Retrofit+RxJava

it2025-12-24  7

文章目录

RetrofitRetrofit2的简述Retrofit注解Retrofit案例 RxJava相关概念被观察者Observable的创建方式1.create2.from3.just 订阅者Observer的创建1.new Observer:同时重写onNext、onError、onCompleted2.new ActionX:选择重写其中某个或某些方法 常见操作符mapScheduler:线程控制器filter:集合进行过滤each:遍历集合take:取出集合中的前几个skip:跳过前几个元素

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)