基於RxJava實現的MVP實例

以前我們所謂的MVC架構通常我們會在Model跟View直接交互,而MVP中我們採用Presenter作爲中間Model獲得數據後傳給Presenter然後Presenter將結果傳遞給View顯示。

這裏寫圖片描述

說明:
步驟1:UI實現View方法,引用Presenter
步驟2:Presenter調用Model,走Model具體邏輯
步驟3:Model邏輯實現,回調Presenter方法
步驟4:Presenter回調View,即回到UI,回調View方法

所以基於上面的結構我們採用RxJava來實現Model的邏輯實現,整體的代碼結構:

這裏寫圖片描述

View層結構:

/**
 * 定義一個View層表現
 * Created by jayuchou on 16/2/25.
 */
public interface PersonView {
    void startLoad();
    void loadDataSuccess(Person person);
    void loadDataFailed();
}

我們將最終界面有交互的功能都封裝成一個View接口以供Presenter回調使用。

Presenter層結構:

我們先定義一個IPresenter接口,供View綁定和解綁使用

public interface IPersonPresenter<V> {
    void attachView(V view);
    void detachView();
}

然後我們定義一個PersonPresenter層作爲View和Model的中間

public class PersonPresenter implements IPersonPresenter<PersonView> {

    private PersonView mPersonView;

    public PersonPresenter(PersonView mPersonView) {
        attachView(mPersonView);
    }

    @Override
    public void attachView(PersonView view) {
        mPersonView = view;
    }

    @Override
    public void detachView() {
        mPersonView = null;
    }
  }

然後Model中的RxJava業務邏輯實現的方法如下:

    public Subscription getPersonInfo() {
        return Observable.create(new Observable.OnSubscribe<Person>() {
            @Override
            public void call(Subscriber<? super Person> subscriber) {
                Person p = new Person();
                p.age = "23";
                p.name = "Jayuchou";
                subscriber.onStart();
                subscriber.onNext(p);
                subscriber.onCompleted();
            }
        }).subscribe(new Subscriber<Person>() {

            @Override
            public void onStart() {
                super.onStart();
                mPersonView.startLoad();
            }

            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                mPersonView.loadDataFailed();
            }

            @Override
            public void onNext(Person person) {
                mPersonView.loadDataSuccess(person);
            }
        });

這裏返回一個Subscription供界面解除對Observable的觀察監聽,但是我們如果把RxJava這段實現獨立在Presenter層實現的話需要再把PersonPresenter作爲參數傳入,這樣代碼看起來比較囉嗦 所以我把model實現寫在PersonPresenter類中,最終的PersonPresenter的代碼完整版爲:

/**
 * P層 將數據從Model中傳遞到View
 * Created by jayuchou on 16/2/25.
 */
public class PersonPresenter implements IPersonPresenter<PersonView> {

    private PersonView mPersonView;

    public PersonPresenter(PersonView mPersonView) {
        attachView(mPersonView);
    }

    @Override
    public void attachView(PersonView view) {
        mPersonView = view;
    }

    @Override
    public void detachView() {
        mPersonView = null;
    }

    public Subscription getPersonInfo() {
        return Observable.create(new Observable.OnSubscribe<Person>() {
            @Override
            public void call(Subscriber<? super Person> subscriber) {
                Person p = new Person();
                p.age = "23";
                p.name = "Jayuchou";
                subscriber.onStart();
                subscriber.onNext(p);
                subscriber.onCompleted();
            }
        }).subscribe(new Subscriber<Person>() {

            @Override
            public void onStart() {
                super.onStart();
                mPersonView.startLoad();
            }

            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                mPersonView.loadDataFailed();
            }

            @Override
            public void onNext(Person person) {
                mPersonView.loadDataSuccess(person);
            }
        });
    }
}

最後在代碼中調用我們需要先把我們的Activity/Fragment實現PersonView

public class MainActivity extends AppCompatActivity implements PersonView {

    private Subscription mSubscription;
    private PersonPresenter presenter;

    @Override
    public void startLoad() {
        Log.i("Jayuchou", "-- startLoad...");
    }

    @Override
    public void loadDataSuccess(Person person) {
        Log.i("Jayuchou", "Success = " + person.toString());
    }

    @Override
    public void loadDataFailed() {
        Log.i("Jayuchou", "Load failed...");
    }
}

然後調用Presenter中的方法即可了:

                presenter = new PersonPresenter(MainActivity.this);
                mSubscription = presenter.getPersonInfo();

這樣我們一個MVP實現就完成了,雖然不是很嚴謹的按MVP設計過來,但是通過小Demo可以對MVP設計懂的更多了。

參考:http://wuxiaolong.me/2015/09/23/AndroidMVPSample/

demo地址:https://github.com/Neacy/RxMvpMaster

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章