Android项目结构之模块内结构优化
来源:互联网 发布:photoshop6 mac 编辑:程序博客网 时间:2024/06/05 21:02
Android的模块内部结构优化
这种优化在于着重对代码的优化,不是性能上的优化,一个好的代码结构可以让你在以后的开发上省去很多时间,而且方便以后对代码的修改,特别是在多人开发的时候,可以有效的进行分工,提高开发效率。
一.基于MOVE模型的代码结构优化
这种优化是基于MOVE模型和中介者模式来进行的,Activity在这里只是起到了一个中介者的作用,把其他的事件和业务逻辑拆分出去,而整个模块中他们是一个横向的结构,而不是传统的纵向结构,数据都是通过event进行分发,先传递到Activity然后通过Activity再分发给相应的业务,所以是业务来驱动数据。而M为Model,O为operation,E为Event,V为View,其中这里的view,event,operation是不能相互见面的,它们之间的交互都是通过Activity来进行转发的。
#move模型图
二.MOVE之模型层(Models)
创建一个原型模型即一个“user”对象。它至少有一个用户名(email),或许还有一个名字(name)和电话号码(number)。
在一个MOVE模型应用程序中,模型层(Models)只用于包装知识。意思是,它包含让你验证“这是否是用户密码?”的函数来让获取(getters)和设置(setters)属性值。但是它不包含让你保存它们到数据库或者上传到一个外部API的函数。这是操作层(Operations)的事情。
三.MOVE之操作层(Operations)
一个基本的操作例子就是让用户登录。这分两个字操作来完整。第一,获取用户的用户名(email)和密码(password)。第二,加载调用从数据库查询出数据而设置好的的“user”模型,验证密码是否正确。
操作层(Operations)是MOVE模型世界的执行者。它的职责是设置的模型层(Models),在正确的时间调用显示正确的视图层(Views)以及相应用户触发引起的事件层(Events)。在一个好的应用程序中,每一个子操作都可以在父操作下独立运行。这也是为什么图表中事件层中流往上走和改变往下走。
用操作层(Operations)这种方式让人惊讶之处在于,当程序重启开始的时候,你的整个应用程序可以视为是一个操作(Operation)。根据需要被分为多个子操作。同时,每一个字操作可以并行存在运行。另外,当所有字操作运行完成时,程序退出。
四.MOVE之视图层
登录界面是一个显示若干文本框给用户的一个视图(View)。当用户点击“Login”按钮,视图(View)会产生一个包含用户输入用户名和密码的“loginAttempt”的事件(event)。
用户能看到和能交互的所有事情应该被建设为一个视图(view)。它们不但不显示应用程序在不明方式下的状态,而且将用户产生的交互简化为有意义的事件(Events)。重要的是,视图(views)不会直接改变模型(models),它们简单地触发事件到操作,然后等待由模型触发事件所引起的改变。
五.MOVE之事件层
事件“loginAttempt”是由于用户点击登录的视图触发的。另外,当登录操作完成,“currentUser”模型会触发事件,将模型引起的改变通知应用程序。监听事件是让MOVE模式(和MVC模式)的一种逆控制。这种控制是在模型没有直接意识到视图在更新的时候,你允许模型更新视图。这是一种高度抽象的技术。这种技术允许组件相互存在而又相互不影响。
六.代码范例
能用代码解决的问题咱们还是都用代码来解决吧,代码只是伪代码,为了表示代码结构。
1.view部分,新建一个Presenter,所有的view的定义界面初始化都在这里。
/***/public class BaseActivityPresenter { private static final int ErrorActivityResId = -1; protected int mLayoutResID; protected WeakReference<Activity> mWeakActivity; protected BaseEventInterface mBaseEventInterface; public YKBaseActivityPresenter(){ mLayoutResID = -1; } public int layoutResID(){ return ErrorActivityResId; } public void setActivityPresenter(Activity activity){ if (null == activity && layoutResID() == ErrorActivityResId ){ return; } activity.setContentView(layoutResID()); mWeakActivity = new WeakReference<Activity>(activity); initView(); } public void setBaseEventInterface(BaseEventInterface baseActivityEventInterface) { mBaseEventInterface = baseActivityEventInterface; } protected void initView(){ }}/**Presenter伪代码*/public class Presenter extends BaseActivityPresenter { private WeakReference<Activity> mWeakActivity; @Override public int layoutResID() { return R.layout.mainactivity; } @Override public void setActivityPresenter(Activity activity) { mWeakActivity = new WeakReference<Activity>(activity); activity.setContentView(layoutResID()); initView(); } @Override public void setBaseEventInterface(YKBaseEventInterface baseActivityEventInterface) { mBaseEventInterface = baseActivityEventInterface; } @Override protected void initView() { Activity activity = mWeakActivity.get(); if(null == activity){ return; } /** 详细方法在event里回调,这里只实现view的展示 */ private void setListener(){ btn.setOnClickListener(new OnClickLisener{ mBaseEventInterface.xxxxx(); } ); }
2.event部分,新建一个event,这是事件的分发类
public interface EventInterface { public void handleBaseEvent(final int eventType, Object contextObject);}/**详细event实现*/public class Event implements YKBaseEventInterface { private WeakReference<Activity> mWeakActivity; private NetCallBack mNetCallBack; public YKLoginEvent(Activity activity){ mWeakActivity = new WeakReference<Activity>(activity); } public void setCallBack(NetCallBack netCallBack){ this.mNetCallBack = netCallBack; } @Override public void handleBaseEvent(int eventType, Object contextObject) { switch (eventType){ case 0: /**详细实现*/ break; case 1: /**详细实现*/ break; } }}
3.manager部分,所有的有关业务的操作都在这里面
public class Manager {private User mUser; private WeakReference<Activity> mWeakActivity; public Manager(Activity activity){ mWeakActivity = new WeakReference<>(activity); } /***业务类,主要业务在这里实现*/ /**数据处理,获取到数据后,在这里再回调回presenter,对数据进行展示。*/ }
4.model部分,数据类
public class YKUser implements Parcelable{ public YKUser(){ } private String mUserId = ""; private String mPhoneNumber = ""; .... .... }
5.Activity或Fragment等,他们只是一个中介的作用,所有的这几个部分都从这里进行交互
public class Activity implements BaseEventInterface { private Presenter mPresenter; private Event mEvent; private Manager mManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPresenter = new Presenter(); mManager = new Manager(this); mManager.setxxxxx(this); mEvent = new Event(this); mEvent.setxxxxx(this); mPresenter.setBaseEventInterface(this); mPresenter.setActivityPresenter(this); } }
MOVE模型为一种横向的代码结构管理模型,各个部分之间的方法的调用可以用回调来实现,然后在Acitivity中进行注册,以Activity为中介,以此来实现各个部分的分离,减少耦合性,但是move模型并不一定试用所有的项目情况,要根据具体需求具体对待,MVP,MVVM都是不错的代码结构模型,但是要根据具体的项目来确定哪种结构是适合自己项目的。以后再总结其他的代码结构管理模型,灵活运用,带到结构优化的目的!
2 0
- Android项目结构之模块内结构优化
- android项目结构优化
- android笔记之项目结构
- Android初学之Android项目结构
- Android入门之Android项目结构
- Android基础之Android项目目录结构
- eclipse android开发 之 项目结构
- Android之项目文件结构分析
- Android之项目的目录结构
- Android 项目学习之 目录结构
- android学习之-项目目录结构
- Android基础之项目结构分析
- Android之项目基本目录结构初识
- Android从零开始构建项目之目录结构
- 4.Android项目之文件结构
- 数据库优化之结构优化
- Android性能优化之优化布局层次结构
- Yii2 应用结构之模块
- 一个动态增长的栈实现
- Java学习之Iterator(迭代器)的一般用法 (转)
- matlab2013b 安装教程
- 读取xml文件和json文件
- 大话设计模式
- Android项目结构之模块内结构优化
- 【剑指offer】3.4代码的鲁棒性——面试题18:树的子结构
- hdu1677 转换LIS
- ios9后关于http协议问题
- 学习笔记06—电话拨号器
- [Volley+Gson]获取PM2.5小应用
- 【剑指offer】4.2画图让抽象问题形象化——面试题19:二叉树的镜像
- 5-11 分段计算居民水费
- Js cookie的用法详解