RxJava+Retrofit+MVP開發(fā)介紹

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兩個接口很相似熏瞄。
    1. 兩者區(qū)別在于:Action1的Call方法無返回值,而Func1的Call方法是有返回值的
    1. 為了更好的解釋兩者谬以,看看以下代碼片段
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模式之前,我們先來看兩張圖:
MVC
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沾谓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子戳鹅,更是在濱河造成了極大的恐慌均驶,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枫虏,死亡現(xiàn)場離奇詭異妇穴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)模软,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門伟骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人燃异,你說我怎么就攤上這事携狭。” “怎么了回俐?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵逛腿,是天一觀的道長稀并。 經(jīng)常有香客問我,道長单默,這世上最難降的妖魔是什么碘举? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮搁廓,結(jié)果婚禮上引颈,老公的妹妹穿的比我還像新娘。我一直安慰自己境蜕,他們只是感情好蝙场,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粱年,像睡著了一般售滤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上台诗,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天完箩,我揣著相機(jī)與錄音,去河邊找鬼拉队。 笑死弊知,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氏仗。 我是一名探鬼主播吉捶,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼皆尔!你這毒婦竟也來了呐舔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慷蠕,失蹤者是張志新(化名)和其女友劉穎珊拼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流炕,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澎现,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了每辟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剑辫。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渠欺,靈堂內(nèi)的尸體忽然破棺而出妹蔽,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布胳岂,位于F島的核電站编整,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乳丰。R本人自食惡果不足惜掌测,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望产园。 院中可真熱鬧汞斧,春花似錦、人聲如沸淆两。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秋冰。三九已至,卻和暖如春婶熬,著一層夾襖步出監(jiān)牢的瞬間剑勾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工赵颅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虽另,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓饺谬,卻偏偏與公主長得像捂刺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子募寨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容