關於MVP、Retrofit、RxJava,以前已經分別作了分享,若是您尚未閱讀過,能夠猛戳:
一、Android MVP 實例
二、Android Retrofit 2.0使用
三、RxJava
四、RxBushtml
假設,您對MVP、Retrofit、RxJava已經有了一點了解,那麼咱們開始本文:java
一、MVP綁定Activity(Fragment)生命週期
按照以前的文章,每一個Presenter都得初始化和銷燬,我新加MvpActivity(MvpFragment),加了抽象方法protected abstract P createPresenter();
這樣作的目的在須要使用MVP的地方,能夠繼承MvpActivity(MvpFragment),而後初始化和銷燬就不用手動一個個去加了。git
二、接口請求等仍是放到MVP的P中
這個圖片,在當時寫MVP文章時給出的,實際開發中,我發現每一個都這樣寫,實在是增長了很多代碼,然接口請求放到P中,還有個好處,就是MVP綁定Activity(Fragment)生命週期,當onDestroy時取消RXJava註冊,以免內存泄露。github
如圖,有個大體瞭解:
mvp:全部的mvp都放在這個包下
retrofit:Retrofit接口和配置文件
rxjava:RxJava一些回調設置
ui:Activity或fragment,建議按功能再細分包api
仍是就貼出核心代碼吧,源碼在個人github上(https://github.com/WuXiaolong/AndroidMVPSample)。微信
MainActivity入口,仍是演示的以前的MVP的天氣的接口,接口請求方法放在Presenter。網絡
Presenter綁定Activity(Fragment)生命週期ide
public abstract class MvpActivity<P extends BasePresenter> extends BaseActivity { protected P mvpPresenter; @Override protected void onCreate(Bundle savedInstanceState) { mvpPresenter = createPresenter(); super.onCreate(savedInstanceState); } protected abstract P createPresenter(); @Override protected void onDestroy() { super.onDestroy(); if (mvpPresenter != null) { mvpPresenter.detachView(); } } }
apiStores.loadData方法是Retrofit作的網絡請求,回調是RxJava完成的。優化
public class MainPresenter extends BasePresenter<MainView> { public MainPresenter(MainView view) { attachView(view); } public void loadData(String cityId) { mvpView.showLoading(); addSubscription(apiStores.loadData(cityId), new SubscriberCallBack<>(new ApiCallback<MainModel>() { @Override public void onSuccess(MainModel model) { mvpView.getDataSuccess(model); } @Override public void onFailure(int code, String msg) { mvpView.getDataFail(msg); } @Override public void onCompleted() { mvpView.hideLoading(); } })); } }
是否是很簡單,關於Retrofit配置,詳見源碼AppClient。ui
public interface ApiStores { //baseUrl String API_SERVER_URL = "http://www.weather.com.cn/"; //加載天氣 @GET("adat/sk/{cityId}.html") Observable<MainModel> loadData(@Path("cityId") String cityId); }
這裏onError,寫了若是網絡請求用httpcode來判斷。固然能夠不要。
public class SubscriberCallBack<T> extends Subscriber<T> { private ApiCallback<T> apiCallback; public SubscriberCallBack(ApiCallback<T> apiCallback) { this.apiCallback = apiCallback; } @Override public void onCompleted() { apiCallback.onCompleted(); } @Override public void onError(Throwable e) { e.printStackTrace(); if (e instanceof HttpException) { HttpException httpException = (HttpException) e; //httpException.response().errorBody().string() int code = httpException.code(); String msg = httpException.getMessage(); if (code == 504) { msg = "網絡不給力"; } apiCallback.onFailure(code, msg); } else { apiCallback.onFailure(0, e.getMessage()); } apiCallback.onCompleted(); } @Override public void onNext(T t) { apiCallback.onSuccess(t); } }
再來看看BasePresenter,這裏作了Presenter初始化和銷燬(包括RXjava取消註冊),調用在MvpActivity。
public class BasePresenter<V> implements Presenter<V> { public V mvpView; public ApiStores apiStores = AppClient.retrofit().create(ApiStores.class); private CompositeSubscription mCompositeSubscription; @Override public void attachView(V mvpView) { this.mvpView = mvpView; } @Override public void detachView() { this.mvpView = null; onUnsubscribe(); } //RXjava取消註冊,以免內存泄露 public void onUnsubscribe() { if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { mCompositeSubscription.unsubscribe(); } } public void addSubscription(Observable observable, Subscriber subscriber) { if (mCompositeSubscription == null) { mCompositeSubscription = new CompositeSubscription(); } mCompositeSubscription.add(observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber)); } }
https://github.com/WuXiaolong/AndroidMVPSample
三者結合使用,重點仍是對MVP的優化,Retrofit只貼出最簡單的(後續會寫Retrofit詳情使用),Rxjava可能我是對它認識尚淺,實際運用最多仍是RxBus。
個人微信公衆號:吳小龍同窗。