使用Rxjava的MVP架构实现

前言: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值