文章目录
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);
}
});