目录
  1. 1. 用静态工厂来封装 retrofit
封装Retrofit

用静态工厂来封装 retrofit

利用反射机制和静态工厂模式,对 retrofit 进行简单的封装

1
2
3
4
5
6
7
8
9
10
11
12
public class ApiFactory {
private Retrofit mRetrofit;


private ApiFactory (){

};
public static ApiFactory newInstance(){
return new ApiFactory();
}

}

利用反射机制,动态获取 apiService,

1
2
3
4
5
6
7
8
9
10
11
public <T> T createApi(Class<T> clz){
initRetrofit();
T api=null;
try{
Class<T> clazz=(Class<T>) Class.forName(clz.getName());
api=mRetrofit.create(clazz);
}catch (Exception e){
e.printStackTrace();
}
return api;
}

initRetrofit对 retrofit 进行配置,对 Rxjava 和 Gson 进行适配。
注:baseUrl 必须以 ‘ / ‘ 结尾。
addCallAdapterFactory是对 R 下 java 进行适配。
addConverterFactory对 Gson 进行适配。

1
2
3
4
5
6
7
8
private void initRetrofit(){
mRetrofit=new Retrofit.Builder()
.baseUrl("http://news-at.zhihu.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(getOkClient())
.build();
}

getOkClient对 okhttpClient 进行初始化配置。
详情注释

1
2
3
4
5
6
7
8
9
private OkHttpClient getOkClient(){
OkHttpClient okHttpClient;
okhttp3.OkHttpClient.Builder ClientBuilder=new okhttp3.OkHttpClient.Builder();
ClientBuilder.readTimeout(30, TimeUnit.SECONDS);//读取超时
ClientBuilder.connectTimeout(10, TimeUnit.SECONDS);//连接超时
ClientBuilder.writeTimeout(60, TimeUnit.SECONDS);//写入超时
okHttpClient=ClientBuilder.build();
return okHttpClient;
}

下面结合 Rxjava 进行一次使用。
Api:Retrofit 基于注解定义的接口

1
2
3
4
public interface ZhihuNewsApi {
@GET("api/3/news/latest")
Observable<ZhihuNewsList> getZhihuNews();
}

Presenter 层对数据的请求和解析。ZhihuNewsApi api = ApiFactory.newInstance().createApi(ZhihuNewsApi.class);利用上面的封装方便的获取 Service 对象。
踩坑日记 :
1.Rxjava1.x 和 Rxjava2.x 冲突解决:使用 Rxjava1.x 后改为 Rxjava2.x 要手动替换包,androidstudio 的自动补全包会默认使用 Rxjava1.x,会造成冲突。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public void getZhihuNewsList() {
ZhihuNewsApi api = ApiFactory.newInstance().createApi(ZhihuNewsApi.class);
Observable<ZhihuNewsList> observable = api.getZhihuNews();
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ZhihuNewsList>() {
@Override
public void onError(Throwable e) {
Log.e("tag","error"+e.toString());
e.printStackTrace();
}

@Override
public void onComplete() {
view.loadsuccess(mdata);
Log.e("tag","oncompleted");
}

@Override
public void onSubscribe(@NonNull Disposable d) {

}

@Override
public void onNext(ZhihuNewsList zhihuNewsList) {
List<ZhihuNewsList.StoriesBean> getlist = zhihuNewsList.getStories();
List<ZhihuNewDate> data = new ArrayList<>();
for (ZhihuNewsList.StoriesBean bean : getlist) {
ZhihuNewDate zhihuNewDate = new ZhihuNewDate();
zhihuNewDate.setId(bean.getId() + "");
zhihuNewDate.setTitle(bean.getTitle());
zhihuNewDate.setPicUrl(bean.getImages().get(0));
data.add(zhihuNewDate);
}
mdata=data;
view.loadsuccess(mdata);
Log.e("tag","onnext");
}
});

}
文章作者: HenryHaoson
文章链接: https://henryhaoson.github.io/2017/05/07/2017-5-4-%E5%B0%81%E8%A3%85Retrofit/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HenryHaoson
打赏
  • 微信
  • 支付寶