王学岗app架构设计-MVP
来源:互联网 发布:数控车床手工编程入门 编辑:程序博客网 时间:2024/06/12 18:03
因为MVC设计架构的缺点,所以我们引入了MVP设计架构
V:视图层:
Activity作为我们的视图层,负责绘制、显示UI;用户交互但不处理,处理在presenter
P: 逻辑层:Presenter/prɪˈzentər/主持
作为View与Model的交互的中间纽带,处理与用户交互的逻辑
M:模型层:
针对业务模型,建立数据结构和相关类,model层与View层无关,与业务相关的数据的操作,针对网络的操作都应该放到model层
我们看下包与类的结构
大家注意model层的代码没有任何变化,
下面我只把view层和presenter层按照从上到下的顺序贴出来
package com.model.gang.impl;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;//获取数据,获取数据是在model层// 可以在网络,数据库,服务器,文件等获取数据public class GetUserInfoImp implements IGetUser { @Override public void getUserInfo(final int id, final OnUserInfoListenner listenner) { // 模拟子线程耗时操作 new Thread() { public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (id == 1) { User user = new User(); user.setName("葛柳君"); user.setAge(18); user.setSex("动物"); // 谁实现了该监听谁就得到了这个数据 listenner.getUusrInfoSuccess(user); } else { listenner.getUusrInfoFail(); } } }.start(); }}
package com.presenter.gang;import android.os.Handler;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;import com.model.gang.impl.GetUserInfoImp;import com.view.gang.IsShowUserView;//作为view和model的交互的中间纽带,处理与用户交互的逻辑//View层 与 presenter层同时开发,即便是不知道View层(布局)也不妨碍presenter的设置//所有的Activity,不管你是什么页面布局,你都遵循presenter层的逻辑,即:先显示进度条,然后获取数据,然后判断数据是否获取成功public class UserInfoPresenter { // 从这里拿到数据 private IGetUser mIGetUser; // 从这里拿到视图/控件 private IsShowUserView mIsShowUserView; private Handler myHandler = new Handler(); public UserInfoPresenter(IsShowUserView mIsShowUserView) { super(); // 数据 this.mIGetUser = new GetUserInfoImp(); // view this.mIsShowUserView = mIsShowUserView; } public void dataBindView(int id) { // 首先显示进度条 mIsShowUserView.showLoading(); // 获取数据 mIGetUser.getUserInfo(id, new OnUserInfoListenner() { @Override public void getUusrInfoSuccess(final User user) { myHandler.post(new Runnable() { @Override public void run() { // 获取数据成功就隐藏进度条 mIsShowUserView.hideLoading(); // 显示数据 mIsShowUserView.toMainActivity(user); } }); } @Override public void getUusrInfoFail() { myHandler.post(new Runnable() { @Override public void run() { mIsShowUserView.hideLoading(); mIsShowUserView.showFailedError(); } }); } }); }}
package com.view.gang;import com.model.gang.User;//抽象出一个接口,约束他的功能public interface IsShowUserView { void showLoading(); void hideLoading(); // 把用户显示到Activity中 void toMainActivity(User user); void showFailedError();}
package com.view.gang;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Handler;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.example.jiagou.R;import com.model.gang.IGetUser;import com.model.gang.OnUserInfoListenner;import com.model.gang.User;import com.model.gang.impl.GetUserInfoImp;//只负责获取数据,显示数据,数据是如何得到的不用管import com.presenter.gang.UserInfoPresenter;public class MainActivity extends Activity implements IsShowUserView { private TextView tv_name; private TextView tv_age; private TextView tv_sex; private Button btn; private ProgressDialog pd; // 定义presenter层的对象 private UserInfoPresenter mUserInfoPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化对象, mUserInfoPresenter = new UserInfoPresenter(this); // 获取控件 setContentView(R.layout.activity_main); tv_name = (TextView) findViewById(R.id.tv_name); tv_age = (TextView) findViewById(R.id.tv_age); tv_sex = (TextView) findViewById(R.id.tv_sex); btn = (Button) findViewById(R.id.get_user); pd = new ProgressDialog(this); pd.setMessage("正在加载"); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mUserInfoPresenter.dataBindView(1); } }); } // 负责显示、隐藏,什么时候显示、隐藏不用管,但可以在presenter中实现 @Override public void showLoading() { // 显示进度条,什么时候显示我不管 pd.show(); } @Override public void hideLoading() { pd.hide(); } @Override public void toMainActivity(User user) { tv_name.setText(user.getName()); tv_sex.setText(user.getSex()); tv_age.setText(String.valueOf(user.getAge())); } @Override public void showFailedError() { Toast.makeText(MainActivity.this, "获取信息失败", 3000).show(); }}
1 0
- 王学岗app架构设计-MVP
- Android App 的设计架构:MVC、MVP、MVVM与架构
- Android App的设计架构 MVC,MVP,MVVM与架构
- Android App的设计架构:MVC,MVP,MVVM
- Android App的设计架构:MVC,MVP,MVVM经验谈
- Android APP架构设计——MVP的使用示例
- Android App 的设计架构:MVC、MVP、MVVM 的分析
- MVP架构设计
- 架构设计之MVP
- MVP架构设计--->001
- MVC---Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- Python装饰器与面向切面编程
- Git和Egit安装使用总结
- 一些常见的运算符重载
- TOJ 2142.Pascal Library
- PHP如何实现网址伪静态
- 王学岗app架构设计-MVP
- 【16.50%】【CF 44G】Shooting Gallery
- 第44课:Spark 2.0编程实战之DataSet案例开发实战
- 工具类:ehCache,用于缓存
- 面试宝典第6章_ 2(const) const 成员函数 ,const 与define定义的不同
- PHP实现伪静态化页面的具体实现方式
- HDU 2028 Lowest Common Multiple Plus
- 机器学习中的数据清洗与特征处理综述
- java常用设计模式