Android---MVP设计模式中级(二)

上一篇MVP设计模式相对来说比较简单 MVP设计模式初级

这一篇的需求逻辑是如下图片(呵呵,盗图于hyman~~洋洋)    点击打开链接下载本需求demo


这个需求的逻辑是

1、首先在M层,定义一个user类,提供姓名、密码字段

2、在M层中提供一个Login的登录业务方法,在这个方法里面在放置一个接口,这样做的用意是登录成功后,在UserLoginPresenter也就是P层代码中,进行页面更新(这里留一个疑问)

3、在就是V层,V层就是对页面的ui的一些操作了,诸如获取填写的姓名、密码、登录,清空,进度条。。。注意这是一个接口方法

4、最后在主界面实现V层的接口,并实现V层里面的接口方法

5、接下来就进入到P层,P层做啥呢?P层就是负责完成View于Model间的交互,首先在P层中,将MV都放进来,因为我要交互,所以需要他们的对象实例

<span style="font-size:14px;"><strong>	private UserBiz userBiz;
	private IUserLoginView userLoginView;</strong></span>

在就是处理里面的逻辑即可


(一)Model层
Model层首先有一个bean类User对象--提供姓名、密码

package com.example.demo;

public class User {
	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

Model想想还有啥啊??肯定有一个登录的业务东东把,

UserBiz

package com.example.demo;

public class UserBiz {

	public void login(final String username, final String password,
			final OnLoginListener loginListener) {
		// 模拟子线程耗时操作
		new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				// 模拟登录成功
				if ("zhy".equals(username) && "123".equals(password)) {
					User user = new User();
					user.setUsername(username);
					user.setPassword(password);
					loginListener.loginSuccess(user);
				} else {
					loginListener.loginFailed();
				}
			}
		}.start();
	}
}

这里定一个了一个接口回调OnLoginListener

package com.example.demo;

public interface OnLoginListener {
	void loginSuccess(User user);

	void loginFailed();
}

(二) View层

上面我们说过,Presenter与View交互是通过接口。所以我们这里需要定义一个ILoginView,难点就在于应该有哪些方法,我们看一眼效果图:

可以看到我们有两个按钮,一个是login,一个是clear;

1、login说明了要有用户名、密码,那么对应两个方法:

2、再者login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作ProgressBar,所以再两个:

3、ogin当然存在登录成功与失败的处理,我们主要看成功我们是跳转Activity,而失败可能是去给个提醒:


IUserLoginView

package com.example.demo;

public interface IUserLoginView {
	String getUserName();

	String getPassword();

	void clearUserName();

	void clearPassword();

	void showLoading();

	void hideLoading();

	void toMainActivity(User user);

	void showFailedError();

}

接下来看P层,就是将mv2层的代码结合起来

UserLoginPresenter

package com.example.demo;

import android.os.Handler;

public class UserLoginPresenter {
	private UserBiz userBiz;
	private IUserLoginView userLoginView;
	private Handler mHandler = new Handler();

	public UserLoginPresenter(IUserLoginView userLoginView) {
		this.userLoginView = userLoginView;
		this.userBiz = new UserBiz();
	}

	/**
	 * implements IUserLoginView 
	 * 调用接口的回调方法
	 */
	public void login() {
		userLoginView.showLoading();
		userBiz.login(userLoginView.getUserName(), userLoginView.getPassword(),
				new OnLoginListener() {
					@Override
					public void loginSuccess(final User user) {
						// 需要在UI线程执行
						mHandler.post(new Runnable() {
							@Override
							public void run() {
								userLoginView.toMainActivity(user);
								userLoginView.hideLoading();
							}
						});

					}

					@Override
					public void loginFailed() {
						// 需要在UI线程执行
						mHandler.post(new Runnable() {
							@Override
							public void run() {
								userLoginView.showFailedError();
								userLoginView.hideLoading();
							}
						});

					}
				});
	}

	public void clear() {
		userLoginView.clearUserName();
		userLoginView.clearPassword();
	}

}

UserLoginActivity

package com.example.demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

public class UserLoginActivity extends Activity implements IUserLoginView {

	private EditText mEtUsername, mEtPassword;
	private Button mBtnLogin, mBtnClear;
	private ProgressBar mPbLoading;

	private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(
			this);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_user_login);

		initViews();
	}

	private void initViews() {
		mEtUsername = (EditText) findViewById(R.id.id_et_username);
		mEtPassword = (EditText) findViewById(R.id.id_et_password);

		mBtnClear = (Button) findViewById(R.id.id_btn_clear);
		mBtnLogin = (Button) findViewById(R.id.id_btn_login);

		mPbLoading = (ProgressBar) findViewById(R.id.id_pb_loading);

		mBtnLogin.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				mUserLoginPresenter.login();
			}
		});

		mBtnClear.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				mUserLoginPresenter.clear();
			}
		});
	}

	/**
	 * implements IUserLoginView 
	 * 实现接口回调方法
	 */
	@Override
	public String getUserName() {
		return mEtUsername.getText().toString();
	}

	@Override
	public String getPassword() {
		return mEtPassword.getText().toString();
	}

	@Override
	public void clearUserName() {
		mEtUsername.setText("");
	}

	@Override
	public void clearPassword() {
		mEtPassword.setText("");
	}

	@Override
	public void showLoading() {
		mPbLoading.setVisibility(View.VISIBLE);
	}

	@Override
	public void hideLoading() {
		mPbLoading.setVisibility(View.GONE);
	}

	@Override
	public void toMainActivity(User user) {
		Toast.makeText(this,
				user.getUsername() + " login success , to MainActivity",
				Toast.LENGTH_SHORT).show();
	}

	@Override
	public void showFailedError() {
		Toast.makeText(this, "login failed", Toast.LENGTH_SHORT).show();
	}
}


activity_user_login.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.demo.MainActivity" >

    <EditText
        android:id="@+id/id_et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </EditText>

    <EditText
        android:id="@+id/id_et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/id_btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login" />

    <Button
        android:id="@+id/id_btn_clear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Clear" />

    <ProgressBar
        android:visibility="gone"
        android:id="@+id/id_pb_loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容介绍 项目结构: Controller层:使用Spring MVC来处理用户请求,负责将请求分发到相应的业务逻辑层,并将数据传递给视图层进行展示。Controller层通常包含控制器类,这些类通过注解如@Controller、@RequestMapping等标记,负责处理HTTP请求并返回响应。 Service层:Spring的核心部分,用于处理业务逻辑。Service层通过接口和实现类的方式,将业务逻辑与具体的实现细节分离。常见的注解有@Service和@Transactional,后者用于管理事务。 DAO层:使用MyBatis来实现数据持久化,DAO层与数据库直接交互,执行CRUD操作。MyBatis通过XML映射文件或注解的方式,将SQL语句与Java对象绑定,实现高效的数据访问。 Spring整合: Spring核心配置:包括Spring的IOC容器配置,管理Service和DAO层的Bean。配置文件通常包括applicationContext.xml或采用Java配置类。 事务管理:通过Spring的声明式事务管理,简化了事务的处理,确保数据一致性和完整性。 Spring MVC整合: 视图解析器:配置Spring MVC的视图解析器,将逻辑视图名解析为具体的JSP或其他类型的视图。 拦截器:通过配置Spring MVC的拦截器,处理请求的预处理和后处理,常用于权限验证、日志记录等功能。 MyBatis整合: 数据源配置:配置数据库连接池(如Druid或C3P0),确保应用可以高效地访问数据库。 SQL映射文件:使用MyBatis的XML文件或注解配置,将SQL语句与Java对象映射,支持复杂的查询、插入、更新和删除操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值