Retrofit与RxJava实践

首先添加Retrofit依赖

compile 'com.squareup.retrofit2:retrofit:2.1.0'

Retrofit通过接口来管理HTTP API,那么首先我们先定义一个API的接口:

public interface ZhihuApi {

    @GET("/api/4/news/latest")//GET方法这里可以换成不同的HTTP请求
    Observable<ZhihuDaily> getLastDaily();

}

然后通过Retrofit.Builder获取到Retrofit实例,并通过create(class)方法获取到我们刚才创建的RetrofitApi接口实例:

Retrofit retrofit=new Retrofit.Builder()
        .baseUrl("http://news-at.zhihu.com")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())                               .addConverterFactory(GsonConverterFactory.create())
.build();

RetrofitApi retrofitApi=retrofit.create(ZhihuApi.class);

.addConverterFactory方法添加相应结果解析器,存放于Retrofit.Builder类的converterFactories集合中。从Builder的构造方法可以看出创建Builder的时候会自动添加一个默认的ConvertFactory。

addCallAdapterFactory方法添加访问处理适配器,存放于Retrofit.Builder类的adapterFactories集合中。


得到实例后就可以使用了

subscription= ZhihuManager.getInstance()
                .getZhihuApiService()
                .getLastDaily()
                .subscribeOn(Schedulers.io())//指定Observable事件产生和变换处理的线程
                .observeOn(AndroidSchedulers.mainThread())//指定订阅者所在的线程
                .subscribe(new Subscriber<ZhihuDaily>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(ZhihuDaily daily) {
                        //get first bean
                        ZhihuDailyItem item=daily.getStories().get(0);
                        printLog("Title:"+item.getTitle());
                        printLog("Data:  "+item.getDate());
                        printLog("Id:    "+item.getId());
                        printLog("Type:  "+item.getType());


                    }
                });

上述接口中的@GET注解也可以是其他的HTTP请求;比如GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,HTTP七种请求方法


Retrofit中的标记类注解

Retrofit支持三种标记类注解,分别是:FormUrlEncoded、Multipart、Streaming。

  • FormUrlEncoded 指请求体是一个Form表单,Content-Type=application/x-www-form-urlencoded,需要和参数类注解@Field,@FieldMap搭配使用
  • Multipart 指请求体是一个支持文件上传的Form表单,Content-Type=multipart/form-data,需要和参数类注解@Part,@PartMap搭配使用
  • Streaming 指响应体的数据以流的形式返回,如果不使用默认会把数据全部加载到内存,所以下载文件时需要加上这个注解

参数类注解

-Headers:添加请求头,作用于方法

   @Headers("Cache-Control: max-age=640000")
   @GET("/api/4/news/latest")
   Observable<ZhihuDaily> getLastDaily();

-Header:用于动态添加头部,作用于方法参数

   @Headers("Cache-Control: max-age=640000")
   @GET("/api/4/news/latest")
   Observable<ZhihuDaily> getLastDaily(@Header("Token") String token);

-Body:用于非表单请求体,作用于方法参数

@GET("/api/4/news/latest")
   Observable<ZhihuDaily> getLastDaily(@Body User user);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章