android MVP连接服务器,Android之MVP模式实现登陆和网络数据加载
MVP简介
相信你们对 MVC 都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP做为MVC的演化版本,也是做为用户界面(用户层)的实现模式,那么相似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。html
Model
Model 是用户界面须要显示数据的抽象,也能够理解为从业务数据(结果)那里到用户界面的抽象。android
View
视图这一层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment体如今了这一层,Activity通常也就作加载UI视图、设置监听再交由Presenter处理的一些工做,因此也就须要持有相应Presenter的引用。git
Presenter
Presenter这一层处理着程序各类逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由业务层作具体的业务操做,而后将获得的 Model 给 View 显示。github
MVC和MVP的区别网络
在 MVC 中:架构
View 能够与 Model 直接交互;
Controller 能够被多个 View 共享;
Controller 能够决定显示哪一个 View 。
在 MVP 中:ide
View 不直接与 Model 交互;
Presenter 与 View 经过接口来交互,更有利于添加单元测试;
一般 View 与 Presenter 是一对一的,但复杂的 View 可能绑定多个 Presenter 来处理;
Presenter 也能够直接进行 View 上的渲染。
模仿登陆案例:(demo中包含登陆和网络数据请求)单元测试
model
public class ModelSignIn implements ILoginSignIn {
@Override
public void onSignIn(String name, String pwd, IOnSetListenter listenter) {
if (name.isEmpty())
{
if (listenter!=null)
{
listenter.onError("输入用户名为空");
return;
}
}
if (pwd.isEmpty())
{
if (listenter!=null)
{
listenter.onError("输入密码为空");
return;
}
}
if(name.equals("dickyqie") && pwd.equals("123456"))
{
if (listenter!=null)
{
listenter.onError("登陆成功");
return;
}
}else{
if (listenter!=null)
{
listenter.onError("登陆失败");
return;
}
}
}
}
presenter
public class Presenter extends BasePresenter {
ILoginSignIn iLoginSignIn=new ModelSignIn();
public void setSignIn(String name,String pwd)
{
iLoginSignIn.onSignIn(name, pwd, new ILoginSignIn.IOnSetListenter() {
IView view=getView();
@Override
public void onError(String error) {
if(view!=null){
view.showToast(error);
}
}
@Override
public void onSccess(String repsonce) {
if(view!=null){
view.showToast(repsonce);
}
}
});
}
}
activity
public class MainActivity extends BaseActivity implements IView,View.OnClickListener{
EditText username;
EditText password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView()
{
username=(EditText)findViewById(R.id.username);
password=(EditText)findViewById(R.id.password);
findViewById(R.id.login).setOnClickListener(this);
}
@Override
public Presenter createPersenter() {
return new Presenter();
}
@Override
public void onClick(View v) {
String name=username.getText().toString();
String pwd=password.getText().toString();
p.setSignIn(name,pwd);
}
@Override
public void showToast(String msg) {
Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG).show();
}
}
网络请求
public class MainActivity extends BaseActivity implements IView,View.OnClickListener {
private TextView textView;
private ProgessDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
textView=(TextView) findViewById(R.id.text);
findViewById(R.id.btn).setOnClickListener(this);
}
@Override
public void onLoadContributorStart() {
showProgress();
}
@Override
public void onLoadContribtorComplete(String topContributor) {
//获得主线程的数据
Message msg=new Message();
msg.what=1;
msg.obj=topContributor;
handler.sendMessage(msg);
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
dismissProgress();
textView.setText(msg.obj.toString());
}
};
@Override
public void onClick(View v) {
p.setGet();
}
@Override
public Presenter createPresenter() {
return new Presenter();
}
@Override
public void onNetWork() {
Toast.makeText(getApplicationContext(),"网络未链接",Toast.LENGTH_LONG).show();
}
@Override
public void onError() {
Toast.makeText(getApplicationContext(),"数据加载失败",Toast.LENGTH_LONG).show();
textView.setText("");
}
/***
* 启动
*/
public void showProgress()
{
if(dialog==null)
{
dialog=new ProgessDialog(MainActivity.this);
}
dialog.showMessage("正在加载");
}
/***
* 关闭
*/
public void dismissProgress()
{
if(dialog==null)
{
dialog=new ProgessDialog(this);
}
dialog.dismiss();
}
}
不要忘记在AndroidManifest.xml加权限哦!
因为代码太多,完整代码未给出,源码直接下载便可
android MVP连接服务器,Android之MVP模式实现登陆和网络数据加载相关推荐
- android 仿快递步骤_Android实现仿美团、顺丰快递数据加载效果
我们都知道在Android中,常见的动画模式有两种:一种是帧动画(Frame Animation),一种是补间动画(Tween Animation).帧动画是提供了一种逐帧播放图片的动画方式,播放事先 ...
- 红米note8pro微信无法连接服务器,在红米Note8Pro微信浏览网页background-image图片无法加载?...
在红米Note8Pro微信内置浏览器打开网页,background-image属性无效,图片无法加载. 情形一 html xxxxxxbody> cssbody {background-imag ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载...
ArcGIS Runtime SDK for Android 支持多种类型空间数据源.每一种都提供了相应的图层来直接加载,图层Layer是空间数据的载体,其主要继承关系及类型说明如下图所示: 转载请注 ...
- 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...
- android 请求大量数据处理,Android大量数据加载—Paging的使用
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Paging主要是用来结合RecyclerView进行使用的.它的作用是能够逐渐地.优雅地加载所需要加载的数据.也就是一 ...
- android 之ListView分页效果以及从网络上加载数据一系列的综合运用
数据分页策略: <1>:用多少查多少 <2>:全部查询出来,再进行分页处理 数据分页的有关算法: (1):起始索引值 = (当前页-1)*每页显示的记录数 (2):结束索引值 ...
- android loader使用教程,Android Loader 机制,让你的数据加载更加轻松
前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现.其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1.Thread + Hand ...
- android Launcher——数据加载与变更
在前面我的blog中,我已经说过了,Launcher所有的桌面项数据是存储在launcher.db/favorites表中 在Launcher启动时loadeworkspace函数中会从数据库中查询所 ...
最新文章
- 数据库连接客户端使用(db2,oracle,mysql)
- Mysql数据库存储引擎--转
- rpython求随机数代码4段5个字符_如何创建一个4位数的随机数并将其存储为变量...
- 【C语言】switch中无break的情况
- Linux中常用的查找文件的命令
- python判断两线段是否相交_c语言 判断两直线段是否相交
- Spring MVC自定义验证注释
- 使用lua实现nginx rewrite
- mysql 配置详解
- SAP License:四类业务四类工厂
- AnyChat视频直播系统全面分析
- Linux内核的学习(二)
- Representation Learning 表示学习(简单笔记)
- 十大开源Web应用安全测试工具
- VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
- Hwclock用法介绍
- Jzoj4896 兔子
- 长春工业大学计算机研究生专业课,长春工业大学(专业学位)计算机技术研究生考试科目和考研参考书目...
- 融云--快速集成融云
- python高斯噪声怎么去除_Python图像处理之Pillow--ImageFilter介绍