Android MVP 利用rxjava 避免向Model传入监听方法

传统的MVP:

1、抽离出View的接口,即ILoginView。

2、抽离Model的接口,即ILoginModel。

3、抽离Presenter的接口,即ILoginPresenter。

4、实现ILoginView 接口的 LoginActivity。

5、实现ILoginModel 接口的 LoginModel。

6、实现ILoginPresenter 接口的 LoginPresenter。

LoginActivity:实现ILoginView 接口以及初始化ILoginPresenter

 1 public class LoginActivity extends BaseActivity implements ILoginView {
 2        private ILoginPresenter mPresenter;
 3        
 4        @Override
 5     public void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_login);
 8 
 9          mPresenter = new LoginPresenter(this);
10      }
11 
12      public void onUserLogin(View view)  {
13            
14           mPresenter.login(userName, password);
15      }
16 }

LoginPresenter:

public class LoginPresenter implements ILoginPresenter {

    private ILoginView mView;
    private ILoginModel mModel;

    public LoginPresenter() {
        init();
    }

    public LoginPresenter(ILoginView view) {
        mView = view;
        init();
    }

    private void init() {
        mModel = new LoginModel(this);
    }
}

 

 

下面改造后抽离后的MVP:

1、抽离出View的接口,即LoginView。

2、抽离Model的接口:使用rxjava 可以避免传入各种CallBack进行结果返回。

  (1)网络层:LoginRepository。

  (2)数据缓存层:LoginCache。

3、根据Model 层,抽离 Presenter层 :LoginPresenter。

4、实现LoginView 接口的 LoginActivity。

5、实现LoginRepository 接口的 LoginRepositoryImpl。

6、(如需要数据缓存,以及缓存操作的)实现LoginCache 接口的 LoginCacheImpl。

7、实现LoginPresenter 接口的 LoginPresenterImpl。

下面例子:

(1)用户界面输入用户名密码,点击登录按钮,出现进度条,进行接口请求.

(2)登陆成功,进度条消失,跳转.

(3)登陆失败,进度条消失,Toast失败原因

布局文件:

 1 <LinearLayout 
 2    xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"  
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent" 
 6     android:orientation="vertical"tools:context=".MainActivity">
 7 
 8 <EditText
 9     android:layout_width="match_parent"
10     android:id="@+id/et_username"
11     android:hint="input user name"
12     android:layout_height="wrap_content" />
13 
14 <EditText
15     android:layout_width="match_parent"
16     android:id="@+id/et_password"
17     android:hint="input user password"
18     android:layout_height="wrap_content" />
19 
20 <Button
21     android:layout_width="match_parent"
22     android:layout_height="wrap_content"
23     android:onClick="onUserLogin"
24     android:text="登录"/>
25 
26 </LinearLayout>

View :

 1 public interface LoginView {
 2 
 3        void showProgress();
 4 
 5        void dismissProgress();
 6 
 7        void onLoginFail(String error);
 8 
 9        void goToActivity();
10 }

Activity :

 1 public class LoginActivity extends AppCompatActivity implements LoginView {
 2 
 3         private EditText userNameEdit;
 4         private EditText pwdEdit;
 5         private ProgressDialog dialog;
 6 
 7         private LoginPresenter presenter = new LoginPresenterImpl(this);
 8 
 9         @Override
10         protected void onCreate(Bundle savedInstanceState) {
11             super.onCreate(savedInstanceState);
12             setContentView(R.layout.activity_login);
13             initViews();
14         }
15 
16         private void initViews() {
17             userNameEdit = (EditText) findViewById(R.id.tv_username);
18             pwdEdit = (EditText) findViewById(R.id.tv_password);
19         }
20 
21         public void onUserLogin(View v){
22             String userName = userNameEdit.getText().toString().trim();
23 
24             String password = pwdEdit.getText().toString().trim();
25             presenter.login(userName, password);// 登录
26         }
27 
28         @Override
29         public void showProgress() {
30             if(dialog==null){
31                 dialog = ProgressDialog.show(this,"","loading...");
32             }else{
33                 if(!dialog.isShowing()){
34                     dialog.show();
35                 }
36             }
37         }
38 
39         @Override
40         public void dismissProgress() {
41             if(dialog!=null&&dialog.isShowing()){
42                 dialog.dismiss();
43             }
44         }
45 
46         @Override
47         public void onLoginFail(final String error) {
48              // 提示登录失败
49         }
50 
51         @Override
52         public void goToActivity() {
53             // 登录成功跳转到其他页面
54         }
55     }

Model,网络层:

public interface LoginReposity {
    // 在网络请求当中,可以一个模块一个Repository
    // 在数据缓存当中,可以一个模块一个Cache
    Observable<JSONObject> login(String userName,String password);
} 

Model,网络层实现类:

public class LoginReposityImpl  {

    public LoginRepositoryImpl(){}

    @Override
    public Observable<JSONObject> login() {
        return Observable.create(new Observable.OnSubscribe<JSONObject>() {
            @Override
            public void call(Subscriber<? super JSONObject> subscriber) {
               // 模拟请求登录成功返回json数据
               JSONObject json = new JSONObject();
                subscriber.onNext(json);
                subscriber.onCompleted();
            }
        });
    }
}

Presenter:

1 public interface LoginPresenter {
2 
3     void login(String userName, String password);
4 }

presenter实现类:

 1 public class LoginPresenterImpl implements LoginPresenter {
 2 
 3     private LoginRepository repository;
 4 
 5     private LoginView view;
 6 
 7     public LoginPresenterImpl(LoginView _view){
 8         view = _view; 
 9         repository = new LoginRepositoryImpl();
10     }
11 
12     public void login(String userName, String password){
13             
14         if(TextUtils.isEmpty(userName)||TextUtils.isEmpty(password)){
15             view.onLoginFail("请完善登录信息");
16             return;
17         }
18         view.showProgress();
19         repository.login(userName, password)
20            .subscribeOn(Schedulers.io())
21                 .observeOn(AndroidSchedulers.mainThread())
22                 .subscribe(new Subscriber<Boolean>() {
23                     @Override
24                     public void onCompleted() {
25 
26                     }
27 
28                     @Override
29                     public void onError(Throwable e) {
30                         view.dismissProgress();
31                         view.onLoginFail(error.getMessage());
32                     }
33 
34                     @Override
35                     public void onNext(Boolean aBoolean) {
36                         view.dismissProgress();
37                         view.goToActivity();
38                     }
39                 }));
40     }
41 }

 

posted @ 2016-08-17 18:21  晕菜一员  阅读(1416)  评论(0编辑  收藏  举报