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);
    }
}
时间: 2024-08-08 01:25:28

Android MVP模式下的登录实现的相关文章

android MVP模式简介

MVP架构略解: M--Model,业务层(主要负责具体功能实现) V--View,视图层(用作显示) P--Presenter,连接层(搭建Model层和View层通信桥梁) MVP模式下,Model层和View层是完全隔离(解偶)的,两者的通信都是通过Presenter层作为桥梁来进行通信的,所以,Presenter层中一定含有Model层和View层具体实例(由这可以看出,当界面改变时,只需更改Presenter层中的View实例即可;同理,当数据加载方式改变时,只需更改Presenter

Android Run模式下提示"Waiting For Debugger"

问:Android Run模式下提示"Waiting For Debugger", 拔掉数据线就一直停在Waiting页面! 试过重启机器, 也是个在manifest里面设置android:debuggable="false", 都不行! 解决:在设置->开发者选项中关闭"调试某个app"

Android MVP模式学习(二)----Data Binding结合

公司项目最近已经用MVP模式重新构造完成,重构后的项目直观明了,代码复用性高,易于调试维护. 之后主管让我去了解MVC,MVP ,MVVM,Data Binding相关的知识,于是便有了下面这篇博客.参考资料: 选择恐惧症的福音!教你认清MVC,MVP和MVVM 完全掌握Android Data Binding 这里很感谢这两篇文章的理论与技术支持,感谢这些大神. OK,开始今天的主题. 关于MVP模式与MVVM模式孰是孰非,我想不是我一个初学者短短几句就能够说清楚的,我们也不用纠结于此.引用大

作为过来人,对于Android MVP模式的一些详解

前言 闲来无事在家偶然翻到了之前整理的文档和面试要做到准备路线,虽然内容有点多,但是技多不压身,多多益善 本部分内容是关于Android进阶的一些知识总结,涉及到的知识点比较杂,不过都 是面试中几乎常问的知识点,也是加分的点. 关于这部分内容,可能需要有一些具体的项目实践.在面试的过程中,结合具体自 身实践经历,才能更加深入透彻的描绘出来 相关内容后续GitHub更新,想冲击金三银四的小伙伴可以找找看看,欢迎star(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)https:/

android MVP模式简单介绍

原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了.要知道在Android上MVP在现在为止并没有统

android MVP模式思考

在软件开发设计中,有多种软件设计模式,如web开发中经典的MVC, 将后台分为三层:Model层,View层和Controller层,其中,Model主要是数据处理,如数据库,文件,或网络数据等:View层是视图层,主要是指前端或后端用于直接展现给用户的页面,Controller层则是负责业务逻辑处理,即将Model中读取的数据显示到View层,同时又将View层触发的操作事件经过业务处理后将数据保存到Model层中. 在android中,可能很多开发者使用的还是mvc模式,比如,在代码中可以发

Android MVP模式简单介绍:以一个登陆流程为例

老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来的好多都没法直接转化为项目里可以直接用的东西,所以这里正好拿出自己项目里已经用了的,你们可以直接用到自己的项目里.当然,不可能把所有项目代码在这里放出来,所以就拿登陆的流程出来,这个比较合适也比较常用. 1.先看下包结构: model:放一些bean类,以及网络处理类RetrofitManager,

Xamarin.Android MVP模式

一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生. 在MVP模式里通常包含4个要素: View:负责绘制UI元素.与用户进行交互(在Android中体现为Activity); View interface:需要View实现的接口,View通过View i

关于Android MVP模式的思考

最近经常看到各种介绍MVP模式的博客的,之前写过不少的Android应用,在做那些应用的时候,都是要求快速完成,所以从开始设计到写代码就一直考虑着重用.以前写的项目基本都是不断重构项目,将项目代码变得更加精简,提高代码之间的复用性.但是代码并没有特别地注重按照MVC模式或者是MVP模式来,更多的是直接考虑模块化,重用,精简.所以看了MVP模式后,决定去总结一下自己代码中的问题并优化,算是对自己之前写的代码的回顾. MVP框架 MVP框架是目前在Android流行起来的框架,它非常适合用于Andr