Android MVP模式下的登录实现

项目结构:

package com.example.mvpdemo.view;

/**
 *    基本的页面操作 
 *
 */
public interface IBaseView {
    //Toast形式提示
    public void showMsg(String msg);
    //加载提示框
    public void    showLoading();
    //隐藏加载提示框
    public void hiddenLoading();
    //页面跳转
    public void jumpActivity();
    //返回
    public boolean back();
}
package com.example.mvpdemo.view;

/**
 *    登陆界面的View,继承基本的IBaseView,IBaseView对于Login界面操作已经足够,所以没有实质内容 
 *
 */
public interface ILoginView extends IBaseView {

}
package com.example.mvpdemo.model;
/**
 * 最基本的模型
 *
 */
public interface IBaseModel {
    public static final int STATUS_FAIL = -1;// 验证失败
    public static final int STATUS_SUCCESS = 0;// 成功
    public static final int STATUS_NORMAL = 1;// 正常状态
    public static final int STATUS_VERIFY_ING = 2;// 正常状态
}
package com.example.mvpdemo.model;
/**
 * 登陆的数据模型
 *
 */
public interface ILoginModel extends IBaseModel{
    /**
     * 
     * @param username 用户名
     * @param pwd    密码
     * @param loginCallBack    登陆回调接口
     */
    public void login(String username,String pwd,ILoginCallBack loginCallBack);
    /**
     *    登陆回调接口及回调方法
     */
    interface ILoginCallBack {
        public void onStatus();
    }
}
package com.example.mvpdemo.model.impl;

import com.example.mvpdemo.model.ILoginModel;

import android.os.AsyncTask;
/**
 * 登陆模型的具体实现
 *
 */
public class LoginModelImpl implements ILoginModel {
    public int status = ILoginModel.STATUS_NORMAL;    //记录登陆状态
    public String msg;    //登陆操作后的提示语
    
    @Override
    public void login(final String username, final String pwd,
            final ILoginCallBack loginCallBack) {
        if (status == ILoginModel.STATUS_VERIFY_ING) {
            return;
        }
            new AsyncTask<Void, Void, ILoginCallBack>() {

                @Override
                protected void onPreExecute() {
                    // TODO Auto-generated method stub
                    super.onPreExecute();
                }

                @Override
                protected ILoginCallBack doInBackground(Void... params) {
                    // TODO Auto-generated method stub
                    //具体的业务实现
                    if (username.equals("123") && pwd.equals("123")) {
                        status = ILoginModel.STATUS_SUCCESS;
                        msg = "登陸成功";
                    } else {
                        msg = "用户名或密码错误";
                        status = ILoginModel.STATUS_FAIL;
                    }
                    return loginCallBack;
                }

                @Override
                protected void onPostExecute(ILoginCallBack result) {
                    // TODO Auto-generated method stub
                    loginCallBack.onStatus();    //登陆成功后进行接口回调,告诉presenter对view操作进行界面操作
                    super.onPostExecute(result);
                }

            }.execute();
    }
}
package com.example.mvpdemo.presenter;

import com.example.mvpdemo.model.ILoginModel;
import com.example.mvpdemo.model.ILoginModel.ILoginCallBack;
import com.example.mvpdemo.model.impl.LoginModelImpl;
import com.example.mvpdemo.view.ILoginView;
/**
 *    登陆的Presenter
 */
public class LoginPresenter {
    LoginModelImpl loginModel;
    ILoginView iLoginView;

    public LoginPresenter(ILoginView iLoginView) {
        super();
        loginModel = new LoginModelImpl();
        this.iLoginView = iLoginView;
    }

    public ILoginView getiLoginView() {
        return iLoginView;
    }

    public void setiLoginView(ILoginView iLoginView) {
        this.iLoginView = iLoginView;
    }
    
    /**
     * 调用model进行数据处理,根据回调接口来操作ILoginView进行对应的activity界面更新
     * @param username
     * @param pwd
     */
    public void login(String username, String pwd) {
        System.out.println(username+","+pwd);
        loginModel.login(username, pwd, new ILoginCallBack() {

            public void onStatus() {
                System.out.println(loginModel.status+"");
                switch (loginModel.status) {
                case LoginModelImpl.STATUS_SUCCESS:
                    iLoginView.jumpActivity();
                    iLoginView.showMsg(loginModel.msg);
                    break;
                case LoginModelImpl.STATUS_FAIL:
                    iLoginView.showMsg(loginModel.msg);
                    break;
                default:
                    break;
                }
                loginModel.status=ILoginModel.STATUS_NORMAL;
            }
        });
    }
}
package com.example.mvpdemo;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.mvpdemo.presenter.LoginPresenter;
import com.example.mvpdemo.view.ILoginView;

public class LoginActivity extends Activity implements ILoginView {
    String Tag = "MainActivity";
    LoginPresenter loginPresenter;
    EditText username_et;
    EditText pwd_et;
    Button submit_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loginPresenter = new LoginPresenter(this);
        initView();
    }

    void initView() {
        username_et = (EditText) findViewById(R.id.username_et);
        pwd_et = (EditText) findViewById(R.id.pwd_et);
        submit_btn = (Button) findViewById(R.id.submit_btn);
        submit_btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                String username = username_et.getText().toString();
                String pwd = pwd_et.getText().toString();
                loginPresenter.login(username, pwd);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void showMsg(String msg) {
        // TODO Auto-generated method stub
        Log.i(Tag, msg);
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showLoading() {
        // TODO Auto-generated method stub
        Log.i(Tag, "showLoading");
    }

    @Override
    public void hiddenLoading() {
        // TODO Auto-generated method stub
        Log.i(Tag, "hiddenLoading");
    }

    @Override
    public void jumpActivity() {
        // TODO Auto-generated method stub
        startActivity(new Intent(LoginActivity.this, MainActivity.class));
    }

    long lastTime;
    @Override
    public boolean back() {
        long currTime=System.currentTimeMillis();
        if(currTime-lastTime>3000){
            showMsg("再按一次退出");
            lastTime=currTime;
        }else{
            finish();
        }
        return false;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if(keyCode==KeyEvent.KEYCODE_BACK){
            return back();
        }
        return super.onKeyDown(keyCode, event);
    }
}

 

posted @ 2014-09-23 17:03  q429786006  阅读(2843)  评论(0编辑  收藏  举报