《Android进阶之光》--RxJava结合Retrofit访问网络
2024-10-17 16:17:25
1)配置
dependencies{
...
compile 'io.reactivex:rxjava:1.2.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:retorfit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
}
2)修改请求网络接口
Retrofit请求接口返回Call。若结合RxJava,则需要把Call改为Observable
public interface IpServiceForPost{
@FormUrlEncoded
@POST("getIpInfo.php")
Observable<IpModel> getIpMsg(@Field("ip") String first);
}
3)修改请求网络方法
private void postIpInformation(String ip){
String url = "http://ip.taobao.com/service/";
Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
IpServiceForPost ipService = retrofit.create(IpServcieForPost.class);
subscription=ipService.getIpMsg(ip).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<IpModel>(){
@Override
public void onCompleted(){
Log.d(TAG,"onCompleted");
}
@Override
public void onError(Throwable e){
Log.d(TAG,"onError");
}
@Override
public void onNext(IpModel ipModel){
String country=ipModel.getData().getCountry();
Toast.makeText(getApplicationContext(),country,Toast.LENGTH_SHORT).show();
}
});
}
4)请求返回数据格式封装
public class IpModel{
private int code;
private IpData data;
public void setCode(int code){
this.code = code;
}
public int getCode(){
return this.code;
}
...
}
public class HttpResult<T>{
private int code;
private T data;
public int getCode(){
return code;
}
public void setCode(int code){
this.code = code;
}
public T getData(){
return data;
}
public void setData(T data){
this.data = data;
}
}
public interface IpServiceForPost{
@FormUrlEncoded
@POST("getIpInfo.php")
Observable<HttpResult<IpData>> getIpMsg(@Field("ip") String first);
}
private void postIpInformation(String ip){
...
subscription=ipService.getIpMsg(ip).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<HttpResult<IpData>>(){
@Override
public void onCompleted(){
}
@Override
public void onError(Throwable e){
}
@Override
public void onNext(HttpResult<IpData> ipDataHttpResult){
IpData data=ipDataHttpResult.getData();
Toast.matkText(getApplicationContext(),data.getCountry(),Toast.LENGTH_SHORT).show();
}
});
}
5)取消请求
@Override
public void onStop(){
super.onStop();
if(subscription!=null && subscription.isUnsubscribed()){
subscription.unsubscribe();
}
}
private CompositeSubscription compositeSubscription = new CompositeSubscription();
...
//发送请求的地方,将返回的subscription添加到compositeSubscription中
compositeSubscription.add(subscription);
...
//取消所有请求
@Override
public void onStop(){
super.onStop();
compositeSubscription.unsubscribe();
}
最新文章
- [LeetCode] Game of Life 生命游戏
- Qt中新建类构造函数的初始化参数列表
- C# ListView用法详解
- response压缩响应
- Heap:Expedition(POJ 2431)
- WinForm下窗体标题栏上有“帮助”按钮
- hadoop map reduce 实例wordcount的使用
- 指定 ubuntu server ip
- Extension Method[上篇]
- 理解ThreadLocal
- Python SqlAlchemy使用方法
- 使用oracle来计算方差及标准差
- ECLIPSE中反编译插件JAD的配置安装,轻松查看JAVA源代码
- SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计
- Linux(Ubuntu 16) 下Java开发环境的配置(一)------JDK的配置
- Java 多线程案例
- Oracle12c中容错&;amp;性能新特性之表空间组
- Python基础2--Python简单数据类型
- PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解
- python带参装饰器的改良版
热门文章
- QToolButton按钮
- springboot使用elasticsearch报No property index found for type错误
- MacOs -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
- 【反射】利用java反射原理将xml文件中的字段封装成对应的Bean
- servlet相关
- Kali2.0更新
- Freemarker导出带多个不重复图片的word
- Maven安装配置操作
- sklearn中的回归器性能评估方法(转)
- Linux的记事本 Vi和Vim