RxJava简单入门
最近一年,Rxjava在Android开发社区中很是活跃。刚接触完全是迷茫状态,看了大神blog,有了一定的了解在通过简单使用,记录初步
本文叙述的内容
- RxJava是什么
- RxJava作用
- Rxjava使用
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)
Hander:
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好用很多
RxJava 作用
rxJava比其他好用之处就在于当你会了之后,通过链式调用看rxJava写的代码条理清晰。
Rxjava 使用
接下来是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);
}
}
});