以前我們所謂的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設計懂的更多了。