RxAndroid简单入门。
来源:互联网 发布:概率和影响矩阵 编辑:程序博客网 时间:2024/05/22 06:32
这段时间研究了一下rxJava,rxAndroid。对于刚接触RxJava的人来说,完全是迷茫状态。相信看了大神的博文之后,心里有这样一个疑问,我只是想学rxJava,lambda和Retrofit又是什么鬼,完全看不懂了。.
所以这篇博文主要是单独讲RxJava在Android中的运用。
一、RxJava是什么?
二、RxJava感觉很牛B,但是又有什么用?
三、我要怎么才能利用RxJava的反应式编程减少在Android中的代码量?
一、RxJava是什么?
一个词:异步。
把这个看作异步的另外一种方式就很好理解了。它是跟AsyncTask,Handler放在一起作比较的。
举一个例:通过天气API获取结果。
需导入RxJava.jar,RxAndroid.jar或者依赖
首先有一个方法:根据API同步获得请求结果
//控件TextView tv;public static final String url_weatherApi = "http://wthrcdn.etouch.cn/weather_mini?city=北京";// okhttp 同步的get请求private String requestGet(String url)
Handler:
new Thread(new Runnable() { @Override public void run() { final String requestGet = requestGet(url_weatherApi); tv.post(new Runnable() { @Override public void run() { tv.setText(requestGet); } }); } }).start();
AsyncTask:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyTask().execute(url_weatherApi); } private class MyTask extends AsyncTask<String, String, String>{ @Override protected String doInBackground(String... params) { String result = requestGet(params[0]); return result; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); tv.setText(result); } }
RxJava:
Observable.just(url_weatherApi) .map(new Func1<String, String>() {//第一个String是参数,即params = url_wetherApi,第二个String是返回结果(用法详见其他博文) @Override public String call(String params) { return requestGet(params); } .subscribeOn(Schedulers.io()) //在io线程(子线程)中操作map转换操作 .observeOn(AndroidSchedulers.mainThread())//在主线程中运行->subscribe里面的 .subscribe(new Action1<String>() { @Override public void call(String result) { //上面return的String tv.setText(result); } });
第一眼看起来RxJava似乎更复杂了,对于初学的确是这样。但是当你用习惯了之后,你会发现这个比handler好用很多(ps.可能吧,博主现在也用的不是很习惯,但我从来不用AsyncTask,总感觉这个太重了=。=)。
二、RxJava感觉很牛B,但是又有什么用?
rxJava比其他好用之处就在于当你会了之后,看rxJava写的代码条理清晰。
比如
{ "desc": "OK", "status": 1000, "data": { "wendu": "25", "ganmao": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。", "forecast": [ { "fengxiang": "无持续风向", "fengli": "微风级", "high": "高温 28℃", "type": "多云", "low": "低温 15℃", "date": "29日星期五" }, { "fengxiang": "无持续风向", "fengli": "微风级", "high": "高温 31℃", "type": "晴", "low": "低温 15℃", "date": "30日星期六" }, { "fengxiang": "无持续风向", "fengli": "微风级", "high": "高温 32℃", "type": "多云", "low": "低温 19℃", "date": "1日星期天" }, { "fengxiang": "北风", "fengli": "4-5级", "high": "高温 23℃", "type": "阵雨", "low": "低温 13℃", "date": "2日星期一" }, { "fengxiang": "北风", "fengli": "4-5级", "high": "高温 27℃", "type": "晴", "low": "低温 13℃", "date": "3日星期二" } ], "yesterday": { "fl": "3-4级", "fx": "南风", "high": "高温 26℃", "type": "多云", "low": "低温 13℃", "date": "28日星期四" }, "aqi": "219", "city": "北京" }}
现在我想取json中yesterday的date。那么在thread中是这样的:
new Thread(new Runnable() { @Override public void run() { final String requestGet = requestGet(url_weatherApi); JSONObject data=null; try { JSONObject json = new JSONObject(requestGet); data = json.getJSONObject("data"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Gson gson = new Gson(); final DataBean dataBean = gson.fromJson(data.toString(), DataBean.class); tv.post(new Runnable() { @Override public void run() { tv.setText(dataBean.getYesterday().getDate()); } }); } }).start();
在rxJava:
Observable.just(url_weatherApi) //把url转成json .map(new Func1<String, String>() { @Override public String call(String params) { return requestGet(params); }}) //把json转为DataBean对象 .map(new Func1<String, DataBean>() { @Override public DataBean call(String arg0) { JSONObject data=null; try { JSONObject json = new JSONObject(arg0); data = json.getJSONObject("data"); } catch (JSONException e) { e.printStackTrace(); } Gson gson = new Gson(); DataBean dataBean = gson.fromJson(data.toString(), DataBean.class); return dataBean; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<DataBean>() { @Override public void call(DataBean arg0) { tv.setText(arg0.getYesterday().getDate()); }}); }
先不管代码量如何。至少我的思路很清晰,我以后需要改什么东西,直接可以很清楚的知道哪里我需要改。而不需要像Thread那样到处去找代码。
现在我有一个需求,在获取了北京的天气后,再获取深圳的天气。并分别给TextView赋值。
public static final String url_weatherApi = "http://wthrcdn.etouch.cn/weather_mini?city=北京"; public static final String url_weatherApi_sz = "http://wthrcdn.etouch.cn/weather_mini?city=深圳";
看一下常规方法。
new Thread(new Runnable() { @Override public void run() { final String requestGet = requestGet(url_weatherApi); tv.post(new Runnable() { @Override public void run() { Log.e("first", requestGet); tv.setText(requestGet); new Thread(new Runnable() { @Override public void run() { final String requestGet = requestGet(url_weatherApi_sz); tv.post(new Runnable() { @Override public void run() { Log.e("second", requestGet); tv.setText(requestGet); } }); } }).start(); } }); } }).start();
这就是所谓的callback hell。
接下来看看RxJava
Observable.just(url_weatherApi) //子线程取北京天气 .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .map(new Func1<String, String>() { @Override public String call(String arg0) { return requestGet(arg0); } }) //主线程赋值 .observeOn(AndroidSchedulers.mainThread()) .map(new Func1<String,String>() { @Override public String call(String arg0) { Log.e("first", arg0); tv.setText(arg0); //返回深圳天气的url return url_weatherApi_sz; } }) //子线程取深圳天气 .observeOn(Schedulers.io()) .map(new Func1<String, String>() { @Override public String call(String arg0) { return requestGet(arg0); } .observeOn(AndroidSchedulers.mainThread()) //主线程赋值 .subscribe(new Action1<String>() { @Override public void call(String arg0) { Log.e("second", arg0); tv.setText(arg0); } });
好处就不多说了,大家自己体会。
三、我要怎么才能利用RxJava的反应式编程减少在Android中的代码量?
利用java 8的新特性lambda
android studio中用retrolambda这个插件。
详见深入浅出RxJava(一:基础篇)
好了,rxJava在Android中使用基本使用就到这里了。
接下来是RxAndroid在Android中的使用。
RxBinding(需导入RxBinding.jar)。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); iv = (ImageView) findViewById(R.id.imageView); ev1 = (EditText) findViewById(R.id.editText1); ev2 = (EditText) findViewById(R.id.editText2); cb = (CheckBox) findViewById(R.id.checkBox1); //ev1的内容状态监听,相当于ev1.addTextChangedListener(watcher),只不过比他好用。 RxTextView.textChanges(ev1).subscribe(new Action1<CharSequence>() { @Override public void call(CharSequence arg0) { tv.setText(arg0); } }); }
//监听checkBox的状态RxCompoundButton.checkedChanges(cb).subscribe(new Action1<Boolean>() { @Override public void call(Boolean arg0) { if(arg0){ iv.setVisibility(View.VISIBLE); }else{ iv.setVisibility(View.GONE); } } });
ps:RxAndroid实际就是RxJava,在Android中,RxAndroid.jar只有一个用处,就是
.observeOn(AndroidSchedulers.mainThread())
在主线程中运行。而RxBinding只是RxAndroid的衍生品。
以上只是RxAndroid简单入门,想要提升还得多看大神写的文章。
参考文献:
给 Android 开发者的 RxJava 详解
深入浅出RxJava
RxJava入门指南
我是用Eclipse的,所以Demo也是eclipse的Demo,里面包含了jar包。
附上Demo:
- RxAndroid简单入门。
- RXAndroid入门
- RxAndroid使用入门记录
- RxAndroid 实践快速入门
- Rxjava Rxandroid入门基础
- RxAndroid入门详解
- RxAndroid 入门笔记
- RxAndroid入门-传智播客
- Rxjava Rxandroid入门基础
- Rxjava Rxandroid基本入门
- Kotlin入门 + RxAndroid+Retrofit2
- RxJava RxAndroid RxBus入门
- RxJava/RxAndroid 入门初体验
- RxJava(RxAndroid)基本使用入门
- RxJava(RxAndroid)基本使用入门
- RxJava(RxAndroid)基本使用入门
- RxJava(RxAndroid)基本使用入门
- RXjava/RxAndroid/lambdas 简单demo
- 聊聊HTTPS和SSL/TLS协议
- 通过 objc_setAssociatedObject alert 和 button关联 及传值
- 系统架构设计——设计模式之策略模式
- 源码 、反码、补码 以及java基本类型转换
- leetcode 136 single number
- RxAndroid简单入门。
- 往发件箱存短信
- iOS自带AVPlayer视频播放器
- 【数据结构与算法】B/B+ 树 、RB树
- 【Effective C++读书笔记】篇二(条款02~条款04)
- SqlServer性能监控和优化总结
- 让自己也能使用Canvas
- python调用siebel的webservice(2种方法)
- NSIS进阶教程(一)~(五)