前几天离职了,让人失望且辱骂员工的老板,要求还那么多,爷我走了。
总算有时间来充实自己了,今天想了想,还是熟悉一下retrofit吧,其实对于它的内部源码,现在我暂时也没兴趣去了解,先给它来个封装吧,方便以后自己集成。
传送门 https://github.com/Ccapton/RxRetrofit
核心代码:基类 BaseApi.java
import com.capton.rxretrofit.listener.HttpOnNextListener;
import com.capton.rxretrofit.retrofit.RetrofitUtil;
import retrofit2.Retrofit;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by capton on 2017/11/29.
*/
public class BaseApi {
private Retrofit retrofit; // retrofit 对象
protected String baseUrl = ""; // 服务器根地址
private String method= ""; // 方法标志,用于在获取数据后的回调里区分不同的api
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getBaseUrl() {
return baseUrl;
}
/*
* 设置服务器根地址
*/
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public HttpOnNextListener onNextListener; // 数据监听器
public BaseApi(HttpOnNextListener onNextListener) {
this.onNextListener = onNextListener;
}
/*
* 获取retrofit对象
*/
public Retrofit getRetrofit(){
this.retrofit = RetrofitUtil.getRetrofit(baseUrl);
return this.retrofit;
}
/*
* 开始进行网络请求
*/
public void doHttpDeal(Observable<String> observable){
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onNext(String value) {
if(onNextListener!=null)
onNextListener.onNext(value,method);
}
@Override
public void onError(Throwable e) {
if(onNextListener!=null)
onNextListener.onError(e);
}
});
}
}
代码结构
1. 用我这个封装库如何编写Api? 请参考下面的NewsApi.java
· NewsApi.java要继承BaseApi.java
· 在NewsApi里要新建一个独立的接口,里面的抽象方法返回值为Observable<String> ,方法内的参数配置具体请参考retrofit2官方文档。
· baseUrl 根据业务需求来设置。有时候需要多个服务器地址,所以我这块没有把它封装死,可以在新建子类api的时候分别设置不同的服务器根地址。
import android.content.Context;
import com.capton.rxretrofit.R;
import com.capton.rxretrofit.api.BaseApi;
import com.capton.rxretrofit.listener.HttpOnNextListener;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
/**
*
* 这个接口用的是我的极速数据新闻api,演示api。
* 如果到时请求不到数据了,应该是被前面的人把剩余的请求数消耗完了,请自行找接口测试吧
*
* Created by capton on 2017/11/29.
*/
public class NewsApi extends BaseApi {
private NewsServer server;
private String appkey;
public final static String GET_NEWS = "get_news"; // 请求方法 ,每个接口类请自由定义(拿到数据后,在回调里的辨别是哪个api的哪个请求)
/**
* 演示api,获取新闻数据
* @param context 这里的context是为了获取系统资源,如果不需要context,则你新建BaseApi子类时可以不传context.
* @param onNextListener 监听回调
*/
public NewsApi(Context context, HttpOnNextListener onNextListener) {
super(onNextListener);
appkey = context.getResources().getString(R.string.jisu_news_appkey); // appkey 不是必须项
setBaseUrl("http://api.jisuapi.com/news/"); // 1. 设置baseUrl
server = getRetrofit().create(NewsServer.class); // 2. 获取Server实例
}
public void getNews(String channel,int start,int num){
setMethod(GET_NEWS); // 3. 设置方法
doHttpDeal(server.getNews(channel,start,num,appkey)); // 4. 开始请求
}
private interface NewsServer{
/**
* 以包裹 String 类型的Observable<String>类型返回,则可以自由地选择解析框架、
* 很直接地可以看到请求到的数据本体
* @param channel
* @param start
* @param num
* @param appkey
* @return
*/
// channel=头条&start=0&num=10&appkey=yourappkey
@GET("get")
Observable<String> getNews(@Query("channel") String channel, @Query("start") int start,
@Query("num") int num, @Query("appkey") String appkey);
}
}
2. 在Activity或Fragment中新建API对象并调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.getData).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getData();
}
});
}
private void getData(){
// 新建NewsApi对象
NewsApi newsApi =new NewsApi(this, new HttpOnNextListener() {
@Override
public void onNext(String data, String method) {
((TextView)findViewById(R.id.showNews)).setText(data);
// 自定义解析的方案
if(method.equals(NewsApi.GET_NEWS)){
NewsBean newsBean = (NewsBean) JsonUtil.strToObject(data,NewsBean.class);
if("0".equals(newsBean.getStatus())){
}
}
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
});
newsApi.getNews("科技",0,10);
}
好吧,这个封装库就简单介绍到这,感兴趣的朋友就来我的github瞧瞧
https://github.com/Ccapton/RxRetrofit