MVP模式实例:登录界面

MVP的核心目标是将无关ui操作的逻辑代码从活动中抽离出来,通过一个presenter控制view和数据层的通讯。

以登录页面为例,页面需要得到用户输入的账号和密码,还要处理登录成功和失败时候的ui变化。但是登陆操作,以及判断返回的数据是成功还是失败,这一部分逻辑不需要活动考虑。

为了抽象出视图层的方法并在presenter中进行调用,定义一个接口,将登录成功失败等view的操作作为抽象函数。然后定义presenter类,在构造器参数中传入接口,这样就可以在类中调用view的方法。最后在活动中实现接口,并实例化presenter进行使用即可。

1.接口:

package com.example.one.junguiapplication.view;

/**
 * Created by lenovo on 2016/11/26.
 */
public interface LoginView {
    void onUserNameError();

    void onPasswordError();

    void onStartLogin();

    void onLoginSuccess();

    void onLoginFailed();
}
2.presenter:
package com.example.one.junguiapplication.presenter;

import com.example.one.junguiapplication.adapter.EMCallBackAdapter;
import com.example.one.junguiapplication.view.LoginView;
import com.hyphenate.chat.EMClient;

/**
 * Created by lenovo on 2016/11/26.
 */
public class LoginPresenter {

    private LoginView view;

    public LoginPresenter(LoginView view){
        this.view=view;
    }

    public void onLogin(String name,String pwd){//还不能做到正确检查
        if(name.length()>20||name.length()<3||pwd.length()<3||pwd.length()>20){
            view.onUserNameError();
        } else {
            EMClient.getInstance().login(name,pwd,mEMCallBack);
        }
    }

    private EMCallBackAdapter mEMCallBack = new EMCallBackAdapter() {

        @Override
        public void onSuccess() {
            view.onLoginSuccess();
        }

        @Override
        public void onError(int i, String s) {
            view.onLoginFailed();
        }
    };
}
3.活动:
package com.example.one.junguiapplication.ui.activity;

import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.one.junguiapplication.R;
import com.example.one.junguiapplication.presenter.LoginPresenter;
import com.example.one.junguiapplication.view.LoginView;

import butterknife.BindView;
import butterknife.BindViews;

public class LoginActivity extends BaseActivity implements LoginView,View.OnClickListener{

    private final String TAG="LoginAcitivity";

    private LoginPresenter presenter;
    @BindView(R.id.etName)
    private EditText etName,etPassword;
    private Button btnLogin;
    private TextView tvRegister;

    @Override
    protected void init() {
        super.init();
        presenter=new LoginPresenter(this);
        etName= (EditText) findViewById(R.id.etName);
        etPassword= (EditText) findViewById(R.id.etPassword);
        btnLogin= (Button) findViewById(R.id.btnLogin);
        btnLogin.setOnClickListener(this);
        tvRegister= (TextView) findViewById(R.id.tvRegister);
        tvRegister.setOnClickListener(this);
    }

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

    @Override
    public void onUserNameError() {
        hideDialog();
        post(new Runnable() {
            @Override
            public void run() {
                toast("请输入正确格式");
            }
        });
    }

    @Override
    public void onPasswordError() {

    }

    @Override
    public void onStartLogin() {
        //隐藏软键盘,弹出进度条,执行登录操作
        hideInputKeyBoard();
        showDialog("登陆中.....");
        presenter.onLogin(etName.getText().toString(),etPassword.getText().toString());
    }

    @Override
    public void onLoginSuccess() {
        hideDialog();
        Log.v(TAG,"**************");
        post(new Runnable() {
            @Override
            public void run() {
                toast("登录成功啦!");
            }
        });
        startActivity(MainActivity.class,true);
    }

    @Override
    public void onLoginFailed() {
        hideDialog();
        post(new Runnable() {
            @Override
            public void run() {
                toast("登录失败");
            }
        });
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnLogin:
                onStartLogin();
                break;
            case R.id.tvRegister:
                startActivity(RegisterActivity.class,true);
                break;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值