Android 当前比较新的框架组合,Retrofit,OKHttp,RXJava的一些简单使用
来源:互联网 发布:网络传播杂志官网 编辑:程序博客网 时间:2024/05/16 15:54
这是我阶段性学习的结果,本文只是简单的使用,为深入研究,大神请绕路,有错误的地方,希望大家指正,首先了解下这三个框架都是什么
做个补充哈,由于retrofit2.0与先前版本的差别还是比较大,对于不同版本之间的差异在这里就不在进行详细区别。下面的例子也是针对于retrofit2.0进行介绍的。retrofit2.0它依赖于OkHttp,而且这部分也不再支持替换。在这里我们也不需要显示的导入okHttp,在retrofit中已经导入okhttp3。
1.OKHttp大家应该比较熟悉,看下面代码即可
// 普通的get请求 private void get() { //创建okHttpClient对象 OkHttpClient mOkHttpClient = new OkHttpClient(); //创建一个Request final Request request = new Request.Builder() .url("https://www.baidu.com/") .build(); //new call Call call = mOkHttpClient.newCall(request); //请求加入调度 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { // 字符串 final String res = response.body().string(); // 二进制字节数组 response.body().bytes(); // 获取流文件,大文件下载 response.body().byteStream(); runOnUiThread(new Runnable() { @Override public void run() { // 更新UI界面 mTv.setText(res); } }); } }); // 阻塞的方式 try { Response response = call.execute(); // 字符串 String res = response.body().string(); // 二进制字节数组 response.body().bytes(); // 获取流文件,大文件下载 response.body().byteStream(); } catch (IOException e) { e.printStackTrace(); } } // 普通的post请求 private void post() { //创建okHttpClient对象 OkHttpClient mOkHttpClient = new OkHttpClient(); //创建一个Request RequestBody requestBody; FormBody builder = new FormBody.Builder().add("username","张鸿洋").build(); Request request = new Request.Builder() .url("https://www.baidu.com/") .post(builder) .build(); mOkHttpClient.newCall(request).enqueue(new Callback(){ @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { } }); }
这个OKHttp跟大部分网络请求框架基本相同,这个框架支持String返回,可以配合GSON,FastJson等json解析,支持二进制返回,他还支持inputStream流文件返回,那么他一定可以下载大文件了,就到这里吧,等我整理好了OKHttp的封装,会放到上面来
2.Retrofit
先来拽一段English
Retrofitting refers to the addition of new technology or features to older systems.—From Wikipedia简单翻译一下,我这个半吊子英文不咋滴,见谅哈翻新(或者说升级)是指在旧系统中增加新技术或新特性看到这个翻新,大概就知道了,这个玩意是某某某的升级版
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是 Retrofit 来完成的。Retrofit 2.0 开始内置 OkHttp,前者专注于接口的封装,后者专注于网络请求的高效,啥意思呢,就这个意思,Retrofit 只负责封装,封装请求参数,URl什么的,有的兄弟就说了,那这玩意还得独自成一个类文件,多麻烦啊,别着急哈,我们慢慢往下看,一会我会结合着OKHttp一起玩
3.RXJava
这是个什么东西呢,有人说是异步,有人说是观察者模式,我个人比较倾向于观察者模式,话说异步我们有很多种方式去实现,Handler,线程, AsyncTask,这里针对RXJava做个代码
// 最简单的RXJava的使用public class RxJavaActivity extends Activity { private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Observable.just("") .map(new Func1<String, Bitmap>() { @Override public Bitmap call(String s) { //可以在这里执行耗时操作,比如下载网络图片,然后转化为Bitmap //下载文件等等操作 return null; } }).subscribeOn(Schedulers.io())//把工作线程指定为了IO线程 .observeOn(AndroidSchedulers.mainThread())//把回调线程指定为了UI线程,至于怎么去的IO线程,又是怎么回到主线程的,只有看源码才能知道了 .subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { //这里是在UI线程,这里显示了图片 mImageView.setImageBitmap(bitmap); } }); }}
如果各位兄弟想详细了解RXJava是什么,都能干什么,那就移步到百度吧,哪里有着详尽的解答,小弟才疏学浅,无法解答,呜呜呜
来来来,言归正传吧
// OKHttp的简单封装public class OKHttpUtil { private static OkHttpClient mOkHttpClient; /** * 获取OkHttpClient对象 * * @return */ public static OkHttpClient getOkHttpClient() { if (null == mOkHttpClient) { //同样okhttp3后也使用build设计模式// try { try { mOkHttpClient = new OkHttpClient.Builder() //添加拦截器 .addInterceptor(new MyIntercepter()) //设置请求读写的超时时间 .connectTimeout(10 * 1000, TimeUnit.SECONDS) .writeTimeout(10 * 1000, TimeUnit.SECONDS) .readTimeout(10 * 1000, TimeUnit.SECONDS) .sslSocketFactory(new TLSSocketFactory()) // .cache(cache) .build(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } return mOkHttpClient; } /** * 拦截器 */ private static class MyIntercepter implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request oldRequest = chain.request(); //----------------以下代码为添加一些公共参数使用-------------------------- // 添加新的参数 Request request = oldRequest .newBuilder()// .addHeader("Version", 1000 + "")// .addHeader("Token", "")// .addHeader("DeviceKind", "2")// .addHeader("Content-Type", "application/json; charset=UTF-8")// .addHeader("Accept", "application/json; charset=UTF-8") .build();// Response response = chain.proceed(request); String requestUrl = request.url().toString(); // 获取请求url地址 String methodStr = request.method(); // 获取请求方式 RequestBody body = request.body(); // 获取请求body String requestBodyStr = (body == null ? "null" : body.toString()); // 打印Request数据 Log.i("request", "requestUrl=====>" + requestUrl); Log.i("request", "requestMethod=====>" + methodStr); Log.i("request", "requestBody=====>" + body); Log.i("request", "requestBodyStr=====>" + requestBodyStr); return chain.proceed(request); } } }
可以加post,get,postUploadFIle,downLoadFile等等方法,当然,我是懒人,啥也没加,哈哈哈哈哈
假设我们有一个UserBean,我们现在想发起一个请求,首先我们需要参数的一些准备工作
public interface RetrofitService { @POST("http://192.168.7.32:8080/appConsole/app/auth.do") Observable<BaseResponseEntity<UserBean[]>> getLoginData( );}
先弄个baseUrl,组合一下参数,发起对应请求,其实这个类就相当于是我们以前的service
public class RetrofitHttp { public static final String BASE_URL = "https://pfizer.efrobot.com/android/"; private Retrofit retrofit; private RetrofitService retrofitService ; //构造方法私有 private RetrofitHttp () { retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(OKHttpUtil.getOkHttpClient()) .baseUrl(BASE_URL) .build(); RetrofitService = retrofitService .create(RetrofitService .class); } //在访问HttpMethods时创建单例 private static class SingletonHolder { private static final HttpMethods INSTANCE = new HttpMethods(); } //获取单例 public static RetrofitHttp getInstance() { return SingletonHolder.INSTANCE; } /** * 用于获取登录数据 */ public void getLoginData(Subscriber<UserBean[]> subscriber) { Observable observable = apiService.getLoginData().map(new HttpResultFunc<UserBean[]>()); toSubscribe(observable, subscriber); } private <T> void toSubscribe(Observable<T> o, Subscriber<T> s) { o.subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s); }}
我们来看一个具体的请求是什么样子的
HttpMethods.getInstance().getLoginData(new NoProgressSubscriber(new SubscriberOnNextListener<DownDataResponseBean[]>() { @Override public void onNext(DownDataResponseBean[] downDataResponseEntities) { if (downDataResponseEntities != null && downDataResponseEntities.length > 0) { // 解析数据,更新UI界面 } else { //数据为空,做相应的处理 } } }, mContext));
注册监听的回调接口
// 注册监听接口public interface SubscriberOnNextListener<T> { void onNext(T t);}
先写到这里吧,有时间回来继续补充,奥对了,附上AS的依赖
// OKHttp3 compile 'com.squareup.okhttp3:okhttp:3.3.1' // Retrofit2 compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:retrofit-converters:2.2.0' compile 'com.squareup.retrofit2:retrofit-adapters:2.2.0' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
写完回顾了一下,发现,我组织语言的能力还是需要加强啊,大家凑合着看吧,只可意会不可言传
- Android 当前比较新的框架组合,Retrofit,OKHttp,RXJava的一些简单使用
- Retrofit+OKhttp+RxJava框架的封装
- 【Android - 框架】之Retrofit+RxJava的使用
- Rxjava+Retrofit+Gson组合框架的使用(一)
- Rxjava+Retrofit的简单使用
- android 网络框架学习(okhttp,retrofit,rxjava)
- Retrofit 2.0 + RxJava 2.0搭建简单的Android请求框架。
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- 结合Retrofit,RxJava,Okhttp,FastJson的网络框架RRO
- 结合Retrofit,RxJava,Okhttp,FastJson的网络框架RRO
- 打造属于自己的网络请求框架(OKHttp+Retrofit+RxJava)
- 如何封装自己的网络框架(RxJava+okHttp+Retrofit)
- Retrofit + RxJava + OkHttp 让网络请求变的简单
- Retrofit+RxJava+Okhttp+RecycleView+MVP简单的展示数据
- Android okHttp的配置使用和Retrofit简单的配置
- Android OkHttp Retrofit RxJava
- hadoop 2.x 安装和配置
- 搜集的一些不错的技术分享和知识整理的网站
- Mybatis# $ 及SQL 踩坑
- java创建数组、HashMap
- c#操作Office 警告:方法和非方法之间存在二义性
- Android 当前比较新的框架组合,Retrofit,OKHttp,RXJava的一些简单使用
- XPath学习:基本语法
- 归并排序
- 深入理解正则表达式
- 今晚8点!UWA六月直播第二弹-Unity引擎渲染效率全解析
- JS事件捕获与冒泡
- 移动端开发注意事项
- inteallij gradle 错误: 编码GBK的不可映射字符 XXXX
- Linux—shell中$(( ))、$( )、``与${ }的区别