其实很久就想写点关于Rxjava的东西了,
无奈实在不知道从哪讲起。
在我看来,一切还不如从实战触出发
rxjava的两大优点
1:链式编程,代码简洁易懂
2:线程间切换方便,自由做主
下面,用一个简单的rxjava的编程方式来下载一张图片
我会一条条解释
首先第一步当然是导包了
在moudle的build文件中导入以下代码
compile 'io.reactivex:rxjava:1.1.8'
compile 'io.reactivex:rxandroid:1.2.1'
第一行是rxjava
第二行rxandroid
当然,我这里不是最新的,各位可以去查查最新的版本了
然后配置文件记得开启网络权限
布局就是一个按钮,点击按钮下载图片放到imageview上
先贴出第一段代码
功能是将一段url转换成bitmap
public Bitmap getBitmaps(String urlstr) {
try {
URL url = new URL(urlstr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
if (conn.getResponseCode() == 200) {
return BitmapFactory.decodeStream(conn.getInputStream());
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
这个大家都不陌生
然后关键的来了!
贴出点击事件中的代码
public void btnClick(View view) {
//url就是图片的url
Observable
.just(url)
//map操作符的作用是将observable发送过来的信息进行类型转换然后发送给observer
//比如parsejson:把string类型的json转换成对象给主线程用
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
//url生成图片
return getBitmaps(s);
}
})
//指定map方法在io线程执行
.subscribeOn(Schedulers.io())
//指定订阅的观察者在安卓主线程执行
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap o) {
iv.setImageBitmap(o);
}
});
}
这里就可以看到链式编程对于代码阅读的好处了
然后就是线程的切换
subscribeOn指定耗时操作在子线程完成
这里就是下载图片
observeOn其中参数AndroidSchedulers.mainThread()
就是指定回到主线程的
这样一来下载一张图片的功能就完成了。
当然,我这里只是最简单的rxjava的使用
真正的rxjava还有很多强大的功能
最后,分享一个用rxjava的方式去封装的网络请求框架
地址是
最好的安卓网络请求库: Fast Android Networking - 泡网
谢谢大家!