RxJava簡介
給Android開發(fā)者RxJava詳解
這算是介紹RxJava比較詳細(xì)的文章了爸舒,閱讀此文我相信你會有很大的收獲的。
RxJava探索
這個專欄中介紹了RxJava中的幾個主要類壹若,值得一看嗅钻,相信會幫助你對RxJava有更深的理解。
其實(shí)RxJava對于Android開發(fā)火了很久了店展,自從筆者使用后养篓,發(fā)現(xiàn)RxJava火起來并不無道理,給筆者的第一印象就是方便赂蕴!方便柳弄!方便!概说,重要的事情說三遍碧注。
接下來我們就一起來結(jié)合代碼看看RxJava給我們開發(fā)帶來了哪些方便。
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() 所發(fā)生的線程席怪,或者叫做事件產(chǎn)生的線程应闯。
- observeOn(AndroidSchedulers.mainThread()) 指定 Subscriber 所運(yùn)行在的線程」夷恚或者叫做事件消費(fèi)的線程碉纺。
- map操作符是過濾信息,返回一個你所需要的任意對象刻撒,并在后面的回調(diào)中進(jìn)行操作骨田。
這樣的鏈?zhǔn)讲僮鬟壿嬍遣皇呛芮宄坎恍枰覀內(nèi)プ鲆恍┚€程的操作声怔,RxJava中已經(jīng)為我們做好了這一切态贤。
以前我們后臺請求數(shù)據(jù),前臺更新ui就會有很多問題醋火。先需要在子線程中做一些IO操作悠汽,后在主線程中去更新ui箱吕。看似還比較簡單柿冲,但如果我們需要在請求回來的數(shù)據(jù)中做一些判定及操作時茬高,那么,代碼就謎之縮進(jìn)了假抄。怎栽。。宿饱。
- Func1和Action1兩個接口很相似熏瞄。
- 兩者區(qū)別在于: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實(shí)際上可看做一個包裝對象,將onNext()打包傳入subscribe() 以實(shí)現(xiàn)不完整定義的回調(diào)蛉签。
- Func1也可以看做一個包裝對象胡陪,只是多了返回值,同樣將打包的對象傳入subscribe() 以實(shí)現(xiàn)不完整定義的回調(diào)碍舍。
RxJava的東西其實(shí)很多柠座,這里只是簡單的介紹了如何使用和一些基本概念,其實(shí)還有操作符片橡,調(diào)度器等等妈经,有興趣了解的小盆友去看看文章開頭所推薦的兩篇文章。
Retrofit簡介
Retrofit簡介
Retrofit在上篇文章中已經(jīng)簡單的介紹了捧书,后面會結(jié)合代碼來具體的使用Retrofit吹泡。
MVP模式簡介
- 在了解MVP模式之前,我們先來看兩張圖:
MVP模式是由MVC模式演變而來爆哑,其原因在于,MVC中的Controller耦合度太高舆吮,Android中的Activity即是Controller也是View揭朝,如果Activity中的業(yè)務(wù)邏輯復(fù)雜一點(diǎn)的話,Activity中的代碼隨隨便便上千行色冀,這是一件很可怕的事情潭袱,即使是你一個人寫的代碼。因?yàn)樵谀阃瓿蛇@個項(xiàng)目后的某一天锋恬,突然要改一個需求屯换,你打開你的編譯器時你會這樣說:靠!這誰寫的代碼与学。分分鐘會讓你自己蒙圈彤悔,這點(diǎn)嘉抓,筆者深有體會!說多了都是淚蜗巧。
MVP模式有一個好處掌眠,就是解耦合蕾盯。Activity和Fragment完全作為View層幕屹,所有的業(yè)務(wù)邏輯我們放在Presenter里,利用Presenter連接Model级遭,處理完后回調(diào)給View層并更新UI望拖。
我們從代碼層面來看看MVP具體的實(shí)現(xiàn)
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("網(wǎng)絡(luò)不給力!");
}
@OnClick(R.id.btn)
public void onClick() {
showProgressDialog();
mvpPresenter.loadDataByRetrofitRxjava(1,20);
}
//處理數(shù)據(jù)
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里面说敏,取回數(shù)據(jù)成功后,回調(diào)給View丢郊,然后更新UI盔沫。這樣的模式是不是很清晰,view和presenter各司其職枫匾,大大降低了耦合架诞。
好了,RxJava+Retrofit+MVP一些基本的東西就介紹完了干茉,隨后還是會上傳一份demo到github上谴忧。
很難得周末一個人靜下心寫寫文章,其實(shí)寫完感覺還是蠻爽的角虫。
demo已上傳到github
RxJava_Retrofit_MVP_Demo