美文网首页
Rxandroid和MVP结合的案例

Rxandroid和MVP结合的案例

作者: 鼾声鼾语 | 来源:发表于2020-07-27 08:42 被阅读0次

    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;
        }
    }
    

    Model

    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();
                    }
                }
            });
        }
    }
    

    View
    定义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);
    }
    
    package 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();
        }
    }
    

    Presenter
    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();
                        }
                    });
        }
    }
    
    

    点击先有一个加载的对话框,然后再消失,出现要显示的内容


    image.png

    相关文章

      网友评论

          本文标题:Rxandroid和MVP结合的案例

          本文链接:https://www.haomeiwen.com/subject/ammalktx.html