使用Rxjava的MVP架构实现

来源:互联网 发布:inur login.php 编辑:程序博客网 时间:2024/04/30 12:41

前言:Rxjava 真的很好用,谁用谁知道,用了你就再也不想捡起Handler 和AsyncTask了大笑


MVP:

在MVP中Model和View之间的没有任何联系,是两个完全独立的模块,当Model模型发生数据改变时,通过Presenter通知View视图发生相应的UI改变。 根据单一职责原则,Activity主要起到用户交互作用,也就是接收用户输入,显示请求结果。因此可以通过MVP框架模式来减轻Activity的职责。


Rxjava,Rxandroid:

下方地址有是找到的Github最详细的Rxjava的介绍连接

强烈建议看完官方文档,在看抛物线的文章 

https://github.com/lzyzsd/Awesome-RxJava


Bean类很简单就一个名字属性

/** * Created by admin on 2016/5/5. * @author xiaozhuge */public class UserBean {    private String name;    public UserBean(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "UserBean{" +                "name='" + name + '\'' +                '}';    }}


Module 里边做一些联网请求,数据库读取等业务

/** * Created by admin on 2016/5/5. * @author xiaozhuge */public class UserModel {    public Observable<UserBean> getUserInfo() {        return Observable.create(new Observable.OnSubscribe<UserBean>() {            @Override            public void call(Subscriber<? super UserBean> subscriber) {                //做一些网络访问 数据库读取等业务逻辑的操作                SystemClock.sleep(2000);                UserBean bean = new UserBean("王尼玛");                subscriber.onNext(bean);                subscriber.onCompleted();            }        });    }}

接着就是view的接口类,这里就定义了四个方法,你可以根据需求自己增加

/** * Created by admin on 2016/5/5. * @author xiaozhuge */public interface UserView {    void updateView(UserBean user);    void showProgressDialog();    void hideProgressDialog();    void showError(String msg);}

最后就是Presenter类用来作为Module和view的通讯桥梁 他需要持有他们的引用

/** * Created by admin on 2016/5/5. * Presenter作为Model和View通讯的桥梁,需要持有它们的引用。 */public class UserPresenter {    private UserModel mModel;    private UserView mView;    public UserPresenter(UserView view) {        mView = view;        mModel = new UserModel();    }    public void getUser() {        mView.showProgressDialog();        mModel.getUserInfo()                .subscribeOn(Schedulers.io())//联网请求在io线程中执行                .observeOn(AndroidSchedulers.mainThread())//更新数据在安卓主线程中,就俩行代码就可以随意切换线程                .subscribe(new Observer<UserBean>() {//订阅 可以传Subscriber 或者Action1的对象,根据需求自己定制                    @Override                    public void onCompleted() { //数据接受完后隐藏Dialog                        mView.hideProgressDialog();                    }                    @Override                    public void onError(Throwable e) { 出现错误的时候弹出错误信息 隐藏dialog                        mView.showError(e.getMessage());                        mView.hideProgressDialog();                    }                    @Override                    public void onNext(UserBean userBean) {//更新UI                        mView.updateView(userBean);                    }                });    }}

最后是UI的显示 

public class MainActivity extends AppCompatActivity implements UserView {    private UserPresenter presenter;    private TextView textView;    private TextView btn;    private ProgressDialog progressDialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        presenter = new UserPresenter(this);        textView = (TextView) findViewById(R.id.tv);        btn = (TextView) findViewById(R.id.tv_show_btn);        progressDialog = new ProgressDialog(this);        progressDialog.setMessage("正在加载中");        if (btn != null) {            btn.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    presenter.getUser();                }            });        }    }    @Override    public void updateView(UserBean user) {        if (null == user) return;        textView.setText(user.getName());    }    @Override    public void showProgressDialog() {        progressDialog.show();    }    @Override    public void hideProgressDialog() {        progressDialog.hide();    }    @Override    public void showError(String msg) {        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();    }    @Override    protected void onDestroy() {        super.onDestroy();        progressDialog.dismiss();    }}

是不是感觉so easy


附件:http://download.csdn.net/detail/zhudewei007/9510939

0 0