MVP模式和RxAndroid是兩個東西,這里因為懶得分開寫,所以寫到了一起寫到了同一個例子里面。
MVP是什么
參考博客:框架模式MVP在Android中的使用 在MVC框架中,View是可以直接讀取Model模型中的數據的,Model模型數據發生改變是會通知View數據顯示發生相應的改變。 而在MVP中Model和View之間的沒有任何聯系,是兩個完全獨立的模塊,當Model模型發生數據改變時,通過PResenter通知View視圖發生相應的UI改變。 根據單一職責原則,Activity主要起到用戶交互作用,也就是接收用戶輸入,顯示請求結果。因此可以通過MVP框架模式來減輕Activity的職責。
RxAndroid是什么
Github:ReactiveX/RxAndroid 參考博客:給 Android 開發者的 Rxjava 詳解 RxAndroid可以簡單高度概括為“異步”。 異步操作很關鍵的一點是程序的簡潔性,因為在調度過程比較復雜的情況下,異步代碼經常會既難寫也難被讀懂。Android 創造的 AsyncTask 和Handler ,其實都是為了讓異步代碼更加簡潔。RxJava 的優勢也是簡潔,但它的簡潔的與眾不同之處在于,隨著程序邏輯變得越來越復雜,它依然能夠保持簡潔。
具體例子代碼
對MVP和RxAndroid不了解的可以去上面說的博客去看一下,都是很好的博客,感謝大牛分享! 我這里以最簡單粗暴的方式貼出代碼,建議先上手再研究,先能夠讓程序跑起來,再去研究代碼里面的實現原理。
引入RxAndroid:在dependencies下面加入如下代碼 最新版本請自己查看Github首頁文檔:ReactiveX/RxAndroid compile ‘io.reactivex:rxandroid:1.0.1’ compile ‘io.reactivex:rxjava:1.0.14’
bean
這里是一個簡單的例子,User只有一個屬性。
package com.regulus.rxandroidtest;public class User { public String name; public User(String name) { this.name = name; }}
123456789123456789Model
package com.regulus.rxandroidtest;import android.os.SystemClock;import rx.Observable;import rx.Subscriber;public class UserModel { public Observable<User> getUser() { return Observable.create(new Observable.OnSubscribe<User>() { @Override public void call(Subscriber<? super User> subscriber) { // 設置個2000ms的延遲,模擬網絡訪問、數據庫操作等等延時操作 SystemClock.sleep(2000);// final User user = null; final User user = new User("趙日天"); if (user == null) { subscriber.onError(new Exception("User = null")); } else { subscriber.onNext(user); subscriber.onCompleted(); } } }); }}
12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829View
定義View的接口,把Activity看成View,實現View接口。 Activity只負責監聽點擊等事件,然后反饋給Presenter,由Presenter調度。
package com.regulus.rxandroidtest;public interface UserView { void updateView(User user); void showProgressDialog(); void hideProgressDialog(); void showError(String msg);}
123456789101112123456789101112package com.regulus.rxandroidtest;import android.app.ProgressDialog;import android.content.Context;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements UserView { private Context context; private TextView mTvShow; private ProgressDialog mProgressDialog; private UserPresenter mUserPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; mUserPresenter = new UserPresenter(this); mProgressDialog = new ProgressDialog(context); mProgressDialog.setMessage("正在加載,請稍后.."); mTvShow = (TextView) findViewById(R.id.tv_show); findViewById(R.id.btn_update).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mUserPresenter.getUser(); } }); } @Override protected void onDestroy() { if (mProgressDialog != null) { mProgressDialog.dismiss(); } super.onDestroy(); } @Override public void updateView(User user) { if (user == null) return; mTvShow.setText(user.name); } @Override public void showProgressDialog() { mProgressDialog.show(); } @Override public void hideProgressDialog() { mProgressDialog.hide(); } @Override public void showError(String msg) { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); }}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869Presenter
Presenter相當于MVC中的控制器,負責Model和View的溝通。
package com.regulus.rxandroidtest;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;/** * Presenter作為Model和View通訊的橋梁,需要持有它們的引用。 */public class UserPresenter { private UserView mUserView; private UserModel mUserModel; public UserPresenter(UserView mUserView) { this.mUserView = mUserView; mUserModel = new UserModel(); } public void getUser() { mUserView.showProgressDialog(); // 這里如果使用 Lambda 會更簡潔 mUserModel.getUser() .subscribeOn(Schedulers.io())// 在非UI線程中執行getUser .observeOn(AndroidSchedulers.mainThread())// 在UI線程中執行結果 .subscribe(new Subscriber<User>() { @Override public void onNext(User user) { mUserView.updateView(user); } @Override public void onCompleted() { mUserView.hideProgressDialog(); } @Override public void onError(Throwable e) { mUserView.showError(e.getMessage()); mUserView.hideProgressDialog(); } }); }}
123456789101112131415161718192021222324252627282930313233343536373839404142434445
123456789101112131415161718192021222324252627282930313233343536373839404142434445博客大部分都是代碼,文筆實在不好……