这是我阶段性学习的结果,本文只是简单的使用,为深入研究,大神请绕路,有错误的地方,希望大家指正,首先了解下这三个框架都是什么
做个补充哈,由于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'
写完回顾了一下,发现,我组织语言的能力还是需要加强啊,大家凑合着看吧,只可意会不可言传