Android开发MVP模式学习笔记

之前开发的项目都是将网络请求、界面更新写在Activity中,也很少有抽取封装,久而久之Activity变得十分臃肿,很难维护,类与类之间耦合严重,往往牵一发而动全身,遂研究了下MVP模式,感觉比传统MVC好了不少。

废话不多说上代码(登录界面)

/** 
* 定义一个接口,定义操作UI抽象方法 
*/  
public interface LoginView {  

    void showProgress();
    void hideProgress();
    void showMsg(String message);
    void jumpToHome();  

}  

Activity 实现上面的接口

/**
 * Activity需要持有一个Presenter对象,将逻辑处理放在Presenter中
 */
 public class LoginActivity extends BaseActivity
    implements LoginView {  

    @BindView(R.id.progress)
    ProgressBar mProgressBar;
    @BindView(R.id.username)
    EditText mUserName;
    @BindView(R.id.password)
    EditText mPassWord;
    @BindView(R.id.btn)
    Button mButton;
    private LoginPresenterImpl mLoginPresenter;

@Override
public int getLayoutId() {
    return R.layout.activity_login;
}

@Override  
public void showProgress() {  
    mProgressBar.setVisibility(View.VISIBLE);  
}  

@Override  
public void hideProgress() {  
    mProgressBar.setVisibility(View.GONE);  
}  

@Override  
public void showMsg() {  
    Tools.showToast(getString(R.string.loginSucc));  
}  

@Override  
public void jumpToHome() {  
    startActivity(new Intent(this, MainActivity.class));  
    finish();  
}  

@OnClick({R.id.btn})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn:
                presenter.login(mUserName.getText().toString(), mPassWord  
                .getText().toString());  
                break;
        }
    }  
}  

presenter接口,声明登录逻辑

/** 
 * Presenter接口,声明了登陆的逻辑处理接口 
 */  
public interface LoginPresenter {  
    void login(String username, String password);  
}  

登录结果回调接口

/**
 * 登录结果回调接口
 */
public interface RequestCallBack {

    void beforeRequest();

    void success();

    void onError();

}

Presenter的具体实现,同时持有View和Interator的引用,处理UI响应,数据处理等,不关心具体操作与实现,只相当于粘合剂,解耦作用

public class LoginPresenterImpl implements LoginPresenter,  
    RequestCallBack {  

    private LoginActivity mView;  
    private LoginInteractor mInteractor;  

    public LoginPresenterImpl(LoginView mView) {  
        this.mView= mView;  
        this.mInteractor= new LoginInteractorImpl();  
    }  

    @Override  
    public void login(String username, String password) {  
        mView.showProgress();  
        mInteractor.login(username, password, this);  
    }  

    @Override  
    public void beforeRequest() {    
        mView.showProgress();  
    }  

    @Override  
    public void onError() {  
        mView.hideProgress();  
    }  

    @Override  
    public void onSuccess() {  
        mView.showMsg();  
        mView.jumpToHome();  
    }  
}  

处理登陆业务的接口

public interface LoginInteractor {  

    Subscription login(String username, String password, RequestCallBack callback);  
    } 

InteractorImpl处理具体登陆业务逻辑

public class LoginInteractorImpl implements LoginInteractor {  

@Override  
public Subscription login(final String username, final String password, final RequestCallBack callback) {  

        return Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscribersubscriber) {

                subscriber.onNext();
                subscriber.onCompleted();
            }
        })
                .subscribe(new Subscriber() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        callback.onError();
                    }

                    @Override
                    public void onNext() {
                        callback.success();
                    }
                });
    }  
}   
一个简单的MVP组合就差不多了

稍微总结一下

Model:

这里的Interactor就是Model层,它定义具体的行为接口供Presenter调用,可以实现不同的Interactor处理不同的Use case。比如数据读取,数据存储,网络请求等等操作。

View

视图层,主要是定义一个View接口,声明各种处理UI组件的方法,然后由Activity实现,但是最后真正的调用时在Presenter中,因为在Activity中定义Presenter时将View作为构造函数的参数传递给了Presenter。

Presenter

业务层,响应UI层,数据层,逻辑处理,持有view和Interactor的引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值