RxJava简介
给Android开发者RxJava详解
这算是介绍RxJava比较详细的文章了,阅读此文我相信你会有很大的收获的。
RxJava探索
这个专栏中介绍了RxJava中的几个主要类,值得一看,相信会帮助你对RxJava有更深的理解。
其实RxJava对于Android开发火了很久了,自从笔者使用后,发现RxJava火起来并不无道理,给笔者的第一印象就是方便!方便!方便!,重要的事情说三遍。
接下来我们就一起来结合代码看看RxJava给我们开发带来了哪些方便。
App
.initCookList(page, rows)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Func1<CookListBean, List<CookListBean.TngouBean>>() {
@Override
public List<CookListBean.TngouBean> call(CookListBean cookListBean) {
return cookListBean.getTngou();
}
}).subscribe(new Action1<List<CookListBean.TngouBean>>() {
@Override
public void call(final List<CookListBean.TngouBean> list) {
initListener(list);
}
});
- subscribeOn(Schedulers.io()) 指定 subscribe() 所发生的线程,或者叫做事件产生的线程。
- observeOn(AndroidSchedulers.mainThread()) 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
- map操作符是过滤信息,返回一个你所需要的任意对象,并在后面的回调中进行操作。
这样的链式操作逻辑是不是很清楚?不需要我们去做一些线程的操作,RxJava中已经为我们做好了这一切。
以前我们后台请求数据,前台更新ui就会有很多问题。先需要在子线程中做一些IO操作,后在主线程中去更新ui。看似还比较简单,但如果我们需要在请求回来的数据中做一些判定及操作时,那么,代码就谜之缩进了。。。。
- Func1和Action1两个接口很相似。
- 两者区别在于:Action1的Call方法无返回值,而Func1的Call方法是有返回值的
- 为了更好的解释两者,看看以下代码片段
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello");
subscriber.onNext("Leo");
subscriber.onCompleted();
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Toast.makeText(RxJavaActivity.this, s, Toast.LENGTH_SHORT).show();
Log.d(TAG, "call: "+s);
}
});
- 不难看出,Action1实际上可看做一个包装对象,将onNext()打包传入subscribe() 以实现不完整定义的回调。
- Func1也可以看做一个包装对象,只是多了返回值,同样将打包的对象传入subscribe() 以实现不完整定义的回调。
RxJava的东西其实很多,这里只是简单的介绍了如何使用和一些基本概念,其实还有操作符,调度器等等,有兴趣了解的小盆友去看看文章开头所推荐的两篇文章。
Retrofit简介
Retrofit简介
Retrofit在上篇文章中已经简单的介绍了,后面会结合代码来具体的使用Retrofit。
MVP模式简介
- 在了解MVP模式之前,我们先来看两张图:
-
MVP模式是由MVC模式演变而来,其原因在于,MVC中的Controller耦合度太高,Android中的Activity即是Controller也是View,如果Activity中的业务逻辑复杂一点的话,Activity中的代码随随便便上千行,这是一件很可怕的事情,即使是你一个人写的代码。因为在你完成这个项目后的某一天,突然要改一个需求,你打开你的编译器时你会这样说:靠!这谁写的代码。分分钟会让你自己蒙圈,这点,笔者深有体会!说多了都是泪。
-
MVP模式有一个好处,就是解耦合。Activity和Fragment完全作为View层,所有的业务逻辑我们放在Presenter里,利用Presenter连接Model,处理完后回调给View层并更新UI。
-
我们从代码层面来看看MVP具体的实现
public class MainActivity extends MvpActivity<CookListPresenter> implements CookListView {
@BindView(R.id.btn)
Button mBtn;
@BindView(R.id.recycler)
RecyclerView mRecycler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initToolBarAsHome("MVP+Retrofit+RxJava");
}
@Override
protected CookListPresenter createPresenter() {
return new CookListPresenter(this);
}
@Override
public void getDataSuccess(CookListModel model) {
dataSuccess(model);
}
@Override
public void getDataFail(String msg) {
toastShow("网络不给力!");
}
@OnClick(R.id.btn)
public void onClick() {
showProgressDialog();
mvpPresenter.loadDataByRetrofitRxjava(1,20);
}
//处理数据
private void dataSuccess(CookListModel model) {
MyAdapter adapter = new MyAdapter(model.getTngou());
mRecycler.setLayoutManager(new LinearLayoutManager(this));
mRecycler.setAdapter(adapter);
}
}
CookListPresenter
public class CookListPresenter extends BasePresenter<CookListView> {
public CookListPresenter(CookListView view) {
attachView(view);
}
public void loadDataByRetrofitRxjava(int page,int rows) {
mvpView.showLoading();
addSubscription(apiStores.getCookList(page,rows), new ApiCallback<CookListModel>(){
@Override
public void onSuccess(CookListModel model) {
mvpView.getDataSuccess(model);
}
@Override
public void onFailure(String msg) {
mvpView.getDataFail(msg);
}
@Override
public void onFinish() {
mvpView.hideLoading();
}
} );
}
}
不难看出,IO操作放在了Presenter里面,取回数据成功后,回调给View,然后更新UI。这样的模式是不是很清晰,view和presenter各司其职,大大降低了耦合。
好了,RxJava+Retrofit+MVP一些基本的东西就介绍完了,随后还是会上传一份demo到github上。
很难得周末一个人静下心写写文章,其实写完感觉还是蛮爽的。
demo已上传到github
RxJava_Retrofit_MVP_Demo
网友评论