zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Android 学习笔记5程序开发模式&拨号器&短信发送器小例程
    Android学习笔记6日志输出&单元测试
    utkernel 移植时调试方法
    在eclipse中查看Android SDK源代码
    (转载)怎样改进数据库的查询性能?
    asp.net 编程模型
    数据回传
    在博客园记录我的成长
    LeetCode14.最长公共前缀
    LeetCode206.反转链表
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/5051792.html
Copyright © 2011-2022 走看看