第一次技术博客
Rxjava+Retrofit+okhttp 网络请求框架学习
学习利用okhttp下载文件
okhttp:一个处理网络请求的开源项目,是安卓端最火热的轻量级框架
retrofit:Retrofit是Square公司开源的一个高质量高效率的http库,它将我们自己开发的底层的代码和细节都封装了起来
rxjava:一种用Java语言实现的响应式编程,来创建基于事件的异步程序
在当下okhttp+retrofit+rxjava是一种比较火热的网络请求框架,在这个框架中:
okhttp主要承担的是创建网络请求client,网络请求过程的作用,大概就是设置网络不稳定时进行重新连接,超时,拦截器等。
CLIENT = OkHttpClient.Builder()
.cache(Cache(File(context.cacheDir, "okhttp"), 10 * 1024 * 1024L))
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build()
这里主要设置了缓存空间,超时连接,读写超时
retrofit其实也是可以单独使用,用来进行网络的请求,但是与okhttp结合后,retrofit的作用体现在对okhttp创建的网络请求进行封装。但是有所不同的是,在retrofit中我们需要定义一个返回接口
public interface RequestServes {
@POST("mobileLogin/submit.html")
Call getReslut(@Query("loginname") String loginname);
}
在接口中我们可以看到,我们返回了一个Call类型的对象,在okhttp我们返回的是一个Responsebody类型的对象。如果我们在retrofit中也想得到一个Responsebody里数据,我们可以这样定义接口
public interface RequestServes {
@POST("mobileLogin/submit.html")
Call<Responsebody> getReslut(@Query("loginname") String loginname);
}
得到Call后我们可以选择同步或者异步来处理回调。下面贴出异步处理回调的做法
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
对于rxjava我个人认为主要作用体现在异步处理时方便切换线程的作用吧。(学的不深,还有很多东西没搞清楚)首先我们需要被观察者Observable,观察者Observer。两者通过subscribe来实现订阅关系。其中我们可以通过subscribeOn和observeOn来规定他们所在的线程。与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()。
@FormUrlEncoded
@POST("getClassFile")
fun getClassFile(@Field("cid")cid: Int): Observable<DataList<TeacherList>> //引入rxjava我们回调时要返回一个Observable对象
fun getClassFile(cid: Int): Observable<ArrayList<TeachersFile>> =
FileApi.IMPX.getClassFile(cid)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.map {
it.data.courseFile
}
.onErrorResumeNext { err: Throwable ->
Observable.just(ArrayList())
}
........