RXJava与Retrofit联合使用
16lz
2021-12-04
1、准备材料:
- Retrofit2、0
- RXJava2、0
// Android 支持 Rxjava// 此处一定要注意使用RxJava2的版本 compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1'// Android 支持 Retrofit compile 'com.squareup.retrofit2:retrofit:2.1.0'// 衔接 Retrofit & RxJava// 此处一定要注意使用RxJava2的版本 compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'// 支持Gson解析 compile 'com.squareup.retrofit2:converter-gson:2.1.0'// compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
2、首先我们来叙说一下Retrofit的基本概念:
- 定义:一个Restful设计风格的HTTP网络请求框架、基于okhttp
- 作者:square公司
- 功能:支持同步,异步网络请求,多种数据格式解析,提供对RXJava支持
3、然后呢我们在回顾一下RXJava基本概念:
- 定义:RXJava是一个基于事件流,实现异步操作的库
- 作用:实现异步操作,类似于Android中的AsyncTask和Handler的作用
- 优点:基于事件流的链式调用——逻辑简洁,实现优雅,使用简单;随着程序逻辑的复杂性提高它依然能够保持简洁的风格
4、基本使用:访问金山词霸的翻译接口
- build.gradle(项目model中的)中添加依赖
- 创建接收服务器返回数据的JavaBean
- 创建用于描述网络请求的接口
- 创建Retrofit实例
- 创建网络请求接口实例 配置网络请求参数
- 发送网络请求
- 对返回的数据进行处理
5、添加 网络权限--清单文件里
1、金山词霸API的数据格式说明:
// URL模板http://fy.iciba.com/ajax.php// URL实例http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world// 参数说明:// a:固定值 fy// f:原文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto// t:译文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto// w:查询内容
json格式说明
/** * status:请求成功则返回1 * content:内容信息 * form:原文内容类型 * to:译文内容类型 * vendor:来源平台 * out:译文内容 * err_no:请求成功时取0 * */ { "status":1, "content":{ "from":"en-Eu", "to":"zh-CN", "vendor":"baidu", "out":"你好世界
", "err_no":0, } }
JavaBean:示例
public class Translation { private int status; private content content; private static class content { private String from; private String to; private String vendor; private String out; private int errNo; } //定义 输出返回数据 的方法 public void show() { System.out.println( "Rxjava翻译结果:" + status); System.out.println("Rxjava翻译结果:" + content.from); System.out.println("Rxjava翻译结果:" + content.to); System.out.println("Rxjava翻译结果:" + content.vendor); System.out.println("Rxjava翻译结果:" + content.out); System.out.println("Rxjava翻译结果:" + content.errNo); }}
创建用于描述网络请求的接口:
/** * Created by com_c on 2018/3/27. */public interface GetRequest_Interface { @FormUrlEncoded @POST("ajax.php?a=fy&f=auto&t=auto") Observable getCall( @Field("w") String context );}
单例模式创建Retrofit
//create RetrofitAPI public static GetRequest_Interface createrApi() { if (retrofit == null) { synchronized (RetrofitUtils.class) { if (retrofit == null) { //打印服务器请求头 HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //okhttp client OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .addNetworkInterceptor(interceptor) .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .retryOnConnectionFailure(true) .build(); //Retrofit 实例化并返回 retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create(new Gson())) .build(); } } } return retrofit.create(GetRequest_Interface.class); }
使用网络请求
retrofit.getCall(content) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onError(Throwable e) { } @Override public void onComplete() { } @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Translation translation) { tvName.setText(translation.show().toString()); } });
更多相关文章
- Android中的几种网络请求方式详解
- android 技术点记录
- android 获取网络资源
- Could not resolve org.jetbrains.kotlin:kotlin-gradle-plugin:
- Android使用DefaultHttpClient访问Wap网络
- Android之判断是否有网封装类
- Android必须要掌握的东西
- 教你如何开关Android的APN网络
- Android(安卓)与javaEE后台网络链接测试