第一次技术博客

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())
                    }

........

posted @ 2017-11-16 17:15  hsh1234  阅读(182)  评论(2编辑  收藏  举报