安卓中MVP模式和RxAndroid的具体实现例子

来源:互联网 发布:大数据时代课题研究 编辑:程序博客网 时间:2024/05/16 02:38

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



0 0
原创粉丝点击