文档章节

Android开发之Retrofit+RxJava的使用

切切歆语
 切切歆语
发布于 2017/02/05 17:11
字数 676
阅读 59
收藏 0

Retrofit是Square公司开发的一款针对Android网络请求的一个当前很流行的网络请求库。

http://square.github.io/retrofit/
https://github.com/square/retrofit

使用需引入:

 

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

Retrofit包含了多种网络请求方式,可根据参考选择。

全路径

 @GET(URL+"?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")
 Call<解析实体类> getInfo1();

@Query("key") String key用于接口键值对类型参数

 @GET("app.php")
 Call<UserInfo> getInfo2(@Query("platform") String platform, @Query("appkey") String appkey, @Query("c") String ip);

@QueryMap  如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递

@GET("app.php")
Call<UserInfo> getInfoMap(@QueryMap Map<String,String> map);

注意:以上GET换成POST也是一样的效果

@Field("key") String key用于接口键值对类型参数

@FormUrlEncoded
@POST("app.php")
Call<UserInfo> postField(@Field("platform") String bookId, @Field("appkey") String title,@Field("c") String content);

@FieldMap  如果Field参数比较多,那么可以通过@FieldMap方式将所有的参数集成在一个Map统一传递

@FormUrlEncoded
@POST("app.php")
Call<UserInfo> postInfoMap(@FieldMap Map<String,String> map);

 

对于 Retrofit 中新的URL定义方式也是有一定要求的,版本不同有时格式也不一样,现在大多数2.0以上,@GET/POST()建议格式不要以 /开头,如:

@POST("/app.php")

而是:URL以 / 结尾  如:(注:全路径则不影响)

http://www.baidu.com/

 

定义接口 IRequestService .java

@GET(URL+"app.php?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")  
Call<UserInfo> getInfo1();  
  
/*@Query("apikey") String apikey 用于接口键值对类型参数*/  
@GET("app.php")  
Call<UserInfo> getInfo2(@Query("platform") String platform, @Query("appkey") String appkey, @Query("c") String ip, @Query("a") String tag);  
  
/*@QueryMap  如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递*/  
@GET("app.php")  
Call<UserInfo> getInfoMap(@QueryMap Map<String,String> map);  

使用

Retrofit retrofit = new Retrofit.Builder() .baseUrl(urls) .addConverterFactory(GsonConverterFactory.create()) .build();
IRequestService service = retrofit.create(IRequestService.class);
Call<DepartmentInfo> call=service.getInfo1();
call.enqueue(new Callback<DepartmentInfo>() { @Override
    public void onResponse(Call<DepartmentInfo> call, Response<DepartmentInfo> response) { DepartmentInfo info=response.body();
        mTextView.setText(info.getError()+"-----"+info.getData().get(0).toString());
        Toast.makeText(getApplicationContext(),info.getError(),Toast.LENGTH_LONG).show();
        Log.i("tag", info.getData().get(0).getDepartname());
        Log.i("tag", info.getData().get(1).getDepartname());
    } @Override
    public void onFailure(Call<DepartmentInfo> call, Throwable t) { } });

Retrofit + RxJava结合使用

和上面差不多, 只不过不再是Call对象而是Observable对象,及RxJava中的事件源。

@GET(URL+"app.php?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")
Observable<UserInfo> getRxjava();

@POST("app.php")
Observable<UserInfo> getUserFollowingObservable(@QueryMap Map<String,String> map);

使用

RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io());
Retrofit retrofit11 = new Retrofit.Builder() 
  .baseUrl(urls) 
  .addConverterFactory(GsonConverterFactory.create())
  .addCallAdapterFactory(rxAdapter) 
  .build();
IRxJavaService apiService = retrofit11.create(IRxJavaService.class);
Observable<DepartmentInfo> call = apiService.getUser(Util.showMap());
subscription = call
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<DepartmentInfo>() { 
            @Override
            public void onCompleted() { }
            @Override
            public void onError(Throwable e) { } 
            @Override
            public void onNext(DepartmentInfo user) { Toast.makeText(getApplicationContext(),
                        user.getData().get(0).getDepartname(),
                        Toast.LENGTH_SHORT) .show();
            } });

总结:

Retrofit的使用和理解简单的梳理了一遍,希望能够帮助大家更好地理解Retrofit的使用。

 

源码点击下载:https://github.com/DickyQie/android-api-request

© 著作权归作者所有

共有 人打赏支持
切切歆语
粉丝 19
博文 323
码字总数 225537
作品 0
杭州
程序员
私信 提问
Retrofit+RxJava构建网络请求

先说Retrofit和RxJava在这个网络请求框架中扮演的角色: 1.Retrofit:负责网络请求,内部使用okhttp作为请求的“引擎”,构建 Retrofit对象时,client(okhttpClient)方法可以传入一个自定义的...

小怪兽是程序员
2018/05/31
0
0
RxJava2+Retrofit2+RxLifecycle2使用MVP模式构建项目

前言 眼下Retrofit+RxJava搭配的网络请求框架很是流行,本着学习的态度,写了一个相关的demo。写着写着就想朝着搭建一个项目框架的方向走。于是使用了一下MVP模式。 RxJava 确实挺好用,个人...

丁佳辉
2018/08/31
0
0
Reading:一款不错的Material Desgin风格的Kotlin版本的开源APP

Reading https://github.com/Hankkin/Reading 简介 很久不见,重新拾起博客吧,今天分享一个开源APP-Reading,项目的初衷是因为自己平时翻文章,但是公众号又经常忘记看,自己索性搞一个APP吧...

Hankkinn
2018/08/22
0
0
RxJava从入门到不离不弃(五)——Scheduler线程调度

在不指定线程的情况下, RxJava 遵循的是线程不变的原则,即:在哪个线程调用 subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到...

Android机动车
2018/10/18
0
0
安卓开发框架(MVP+主流框架+基类+工具类)--- 开篇

前言 近期研究了几个主流开源框架的使用,有Retrofit(网络请求),RxJava(异步操作),GreenDAO(数据库操作),Fresco(图片加载),EventBus(事件通信),ButterKnife(资源绑定)。这些...

JYcoder
2017/10/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

第11章 多线程

程序、进程、线程 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 **进程(process)**是程序的一次执行过程或是正在运行的一个程序。动...

流小文
10分钟前
0
0
SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部