针对C/S架构的android应用问题描述:分离Activity中业务逻辑,只提供对外改变UI样式接口设想:针对每一个Activity分别提供一个类与其绑定,这个类完成其Activity的相关业务逻辑
参照Spring框架,类似于依赖注入的方式实现欢迎有架构经验的朋友提出意见,对此进行可行性分析....(该板块等级不够,分数不多可以另开贴)

解决方案 »

  1.   

    不太了解Spring ,惭愧 
      

  2.   


    你玩好嵌入式就很有前途了....学技术不在多,在于精!我一直认为什么都懂等于什么都不懂,呵呵....其实所有IT技术组成的是一个树结构,根节点是一样的啦!hoho!!!
      

  3.   


    我就是学什么都不精,看见不懂的老想问问,琢磨琢磨是怎么回事,处于你所说的什么都不懂的状态~~~
    Mark一下这个帖,表示强烈关注,我就是想浅浅的了解下,满足下好奇心、求知欲~ 求扫盲
      

  4.   

    在移动版块,你这么说让很多人又情何以堪呢!呵呵...有这份心,前途+钱途你都会有的啦我也很期待有人过来一起探讨~~~说实话对CSDN真的不抱太大希望,只是分放着还不如碰碰运气说不定牛人心情好愿意出来指点一下,那就受益匪浅了...
      

  5.   

    我记得老师说过已经有个开源项目就是把spring移植到手机应用上,还说已经实现了。。不记得那个开源项目的名字对spring没什么好感太臃肿了。现在sqlite的操作已经很简便了。。
      

  6.   

    有spring mobile和spring android的项目,参见 http://www.springsource.org/spring-android
    不过我觉得android本身的设计已经算是MVC的架构了,所以有没有必要一定要spring呢,毕竟应用场景不一样,而且性能是需要考虑的,为一个应用就要弄这么个东西未必合适。
      

  7.   

    把JAVA框架,拿到Android上来用... 
      

  8.   

    android 不是web没那么必要吧   web开发都会抱怨速度慢,怎么办,不用hibernate,再慢,不用spring,不用struct,  用户又不管你是怎么构架的,跑得快就行了,
      

  9.   

    对于臃肿这个问题,需要根据项目的大小来衡量!对于大型项目Spring还是有它的独到之处,我想玩过J2EE的人都不能否认这点吧!这只是我的一个设想,感谢楼上各位所提的建议
      

  10.   

    Spring两大好处依赖注入和控制反转,前者可以说把MVC三层分别交给它管理,或者说service,contentProvider等四大组件都交给它管理,不过好像android项目一般都不大吧。不知道用不用得着。至于控制反转更用不着了吧。没有对数据库太多操作又不是做服务器端
      

  11.   

    以后说不定会用得着不是有个i-jeety的servlet容器吗,在android下运行的
      

  12.   

    呵呵!我也是这么想的....大致方向可行的话,接下来就是些细节上的处理了,倒是可以考虑在android上再架一层
      

  13.   

    我是做EE的,没事自己玩玩android的,对于你这个想法,简单说说我的感受。
    我觉得android的核心设计已经在一定程度上使用了EE的一些思想,比如R,比如所有的UI元素都会自动编译成ID以便调用访问,比如自定义的一些values。等等都是相对来说比较好的思路。最直接的说就是把程序的变化点尽量非程序化。
    在spring中的最核心的思想是IoC和面向切面(个人理解),而其初衷也是想把程序的变化点非程序话,通过容器的配置来定制系统。
    可能我理解的比较肤浅,还有很多细节的地方可以比较。
    所以,没有必要把spring硬搬上来,只是为了抽象UI和业务逻辑来架构android,个人觉得意义不大。因为android本来就是精简的系统,资源占用少,效率要求高,但是如果用spring的话,有悖于这两个思想初衷。
      

  14.   

    对android来说,用户体验和效率是最重要的,业务逻辑的分离是针对的是企业信息管理的特点。ee里面的很多概念对android来说都是不适用的。
      

  15.   

    感谢楼上两位~~你们都提到了效率这个问题,效率本质上是空间和时间的转换~~~空间换时间还是时间换空间,这个问题取决于硬件确实目前android系统下平板的硬件跟电脑还是有所差距如果是十年前的电脑配置,J2EE中的Spring也不一定能流行起来
      

  16.   

    leemiki真是高手,看问题真是有高度。
    但是说来惭愧,不太了解WEB框架,我个人感觉你的问题有没有必要为了迁就开发团队的知识结构而把不同平台上面的程序一定要整合在一个统一的架构下,在ANDROID下面的STRPING总觉得别扭。
      

  17.   

    我又看了一下LZ的问题,第一感觉这个贴子我一定要加精了,呵呵。
    我这么理解,因为是第一眼看没有任何深入的思考,按照LZ的说法,一个ACTIVTY一个对应类的实现方式,那么需要从ACTIVITY继承一个子类以下简称A,也要从实现业务逻辑的父类(以下简称B)来继承一个子类(以下简称C),在这个类A要操作一个实现业务逻辑类的父类(简称B)的对象来完成业务逻辑,那么就需要创建A类的对象的时候传递一个业务逻辑类B的子类对象做为参数。
    这个看起来也没什么问题,我只是直觉上,感觉业务逻辑类的实例可能也需要操作ACTIVITY类的实例来完成工作,可能会有耦合性上的问题,没有深入想,请楼主补充吧,这真是一个很有意思的问题,希望我能抛砖引玉。
    一会我试一下能不能给贴子加分:)
      

  18.   

    贴子加精成功,我也给贴子加上分了,欢迎大家热烈讨论,这个真是一个WEB架构和移动架构的碰撞,期待更深入的讨论结果!!
      

  19.   

    思想很多,这个帖子不错,android好像有个web开发框架,叫titanium,了解不深,不知道有没有spring的思想在里面
      

  20.   

    感谢高手的建议~~~你说的是我目前的想法,业务逻辑类的实例确实要操作ACTIVITY类的实例
    Context这个实例牵涉的范围太广了,对一个Activity中UI操作必定会涉及到它要实现类似Spring的依赖注入,需要解决这个context的创建问题空下来我会考虑去看下android的上层框架Context的实现楼下有人看过,希望给予指点,谢谢~~
      

  21.   

    我也是做J2EE开发的,android只是自学了不到一个月时间,写过些简单的demo。
    应该是做J2EE开发的习惯使然,所以也考虑过楼主说的这种情况,将业务逻辑从activity中剥离。
    业务类中需要操作activity还找不到合适的方法解决,只是有个想法,能不能将activity中对UI的操作也剥离出来呢?剥离出来的这部分作为一个贯穿多层的切面来使用。
    呵呵,想法很不成熟,只是发表下自己的观点。
      

  22.   

    我来拍几个砖:
    我建议各位不要也永远不要在android这些客户端开发上使用诸如spring,ioc,反射这样的玩意,你会遇到你无法想象的各种各样的麻烦(事实上我就遇到过各种各样的),而且你往往会束手无策。你得到的所谓的解耦和你所付出的根本不成比例。
    首先android的代码经常要混淆,一旦你使用坑爹的反射,你就等着好好研究混淆策略吧
    其次很多时候你写的是库,你根本不知道对方要如何使用。而使用了反射,你很有可能需要带上一个很巨大的框架。而这是没必要的。(我集成过一个支付框架,使用坑爹的反射,我看手册的时候差点都被绕晕了。这就是那些人喜欢折腾的所谓设计模式)
    再有,使用反射很多时候你会绕过基本的代码检查,会绕过系统框架的定义,不利于一些自动化测试工具(这些工具有时候会做一些假设),诸如如果你要把应用提交到亚马逊上,它们自带了一个代码注入检测工具,你的应用很可能会被拒绝
    最后,程序就是程序。简单,直接,明快是最重要的设计思路。模块化,清晰的接口才是重点,至于花里花俏的,不仅你用起来烦,别人看起来更烦。
      

  23.   

    路人说两句:
    “效率本质上是空间和时间的转换~~~”
    不太同意,太机械了吧,如果一个架构和一个平台,只是靠硬件堆砌的...不能说是高效吧。(这里说MTK是不是很土气)我觉得一个好的架构,应是有活性的,功能间有结合而不是分离是更好的效率。Android历来注重效率的观念很正确。
      

  24.   

    我又看了一下LZ的问题,第一感觉这个贴子我一定要加精了,呵呵。
    我这么理解,因为是第一眼看没有任何深入的思考,按照LZ的说法,一个ACTIVTY一个对应类的实现方式,那么需要从ACTIVITY继承一个子类以下简称A,也要从实现业务逻辑的父类(以下简称B)来继承一个子类(以下简称C),在这个类A要操作一个实现业务逻辑类的父类(简称B)的对象来完成业务逻辑,那么就需要创建A类的对象的时候传递一个业务逻辑类B的子类对象做为参数。
    这个看起来也没什么问题,我只是直觉上,感觉业务逻辑类的实例可能也需要操作ACTIVITY类的实例来完成工作,可能会有耦合性上的问题,没有深入想,请楼主补充吧,这真是一个很有意思的问题,希望我能抛砖引玉。
    接着昨天的说吧,我觉得让这个ACTIVITY子类A直接拿着一个业务逻辑的实例也有问题,还是再创建一个类同时拥有ACTIVITY与业务逻辑的实例比较好,另外这个类当中至少还应该有一个属性还标明CURRENTWORKING。
    大家继续。
      

  25.   

    随着Android平台的发展,以后的应用肯定会很负责。这个有必要发展。!
      

  26.   

       今年才毕的业,在大学里,学的说是java,其实学的很广,没有所谓精不精的,就感觉对java还挺有兴趣的,毕业了从事了android,感觉这样就是从事了android跟java,兼得,在说了,虽说我经验不多,还不到一年,不过真心觉得SSH真的是个好东西...,我一直想精于SSH这东西,就是现在做android项目不需要用到这,LZ这想法倒是挺不过了,至少创新算是吧...
      

  27.   

    我觉得你有些误解,效率这个问题是有人提出来的,我并没说分离就是效率、
    之所以要分层是为了降低耦合性,提高扩展性
    为什么10多年前写代码这么注重效率?那是因为当时内存很贵,不释放内存会被认为是很大的BUG
    一般玩Java的有多少人写逻辑代码的时候会考虑到效率问题
    如果以后Android硬件上达到电脑的配置,你还会选择效率第一,架构第二??
      

  28.   


    就现在Android的硬件配置跟电脑相差太远,效率会是合理的选择
    所以我的标题也只是探讨~~~~~
      

  29.   

    这样的想法非常好,只要有面向对象的地方,都可以去尝试讨论和实现这样的设计思想,呵呵。我理解楼主的想法有两层含义:1.分离UI和业务逻辑,因此为每个Activity绑定一个业务类。2.解除Activity对业务类的强耦合关系,让Activity依赖于逻辑接口,使其依赖倒置,这里就模仿了spring通过反射来配置实现类。第2点我觉得肯定可以通过技术手段做到,其实这也不是spring独有的,面向对象准则的依赖倒置原则即是该思想。但是第1点要真正做到真的很难。手机上的UI逻辑不同于web上能更好的分离,web由于有清晰的数据请求等,而一些页面逻辑又是js实现,这样使得MVC模式更为清晰,手机上真的很难,期待楼主的具体案例实施。
      

  30.   

    spring-android 我用过,主要是对网络操作这一块做了封装,大家可以去看看spring-android的实例代码就会明白了,其它的部分仍然是 android的那一套机制。
      

  31.   

    工厂为什么需要用反射?如果你非要用配置来取代编码的话,那么最终就是跟ssh一样,一堆xml
    事实上android现在的manifest就是一份类的配置文件,启动activity的时候就是用反射的机制。但是它也就限于此了,而没有继续搞一大堆。
    如果真要扯设计模式的话,那我不明白在客户端上你要aop干什么。spring之所以用aop,是为了事务加锁,为了日志,为了鉴权。而android大部分是客户端程序,涉及到UI,如果你有去了解每一个UI的设计者的思路的话(比如MFC作者,cocoa的作者)就会知道,他们有许多东西需要权衡。UI跟逻辑是绑得很紧密的,一方面为了快速响应,一方面很多时候你很难说清,到底“改变一个按钮的颜色”这个到底属于UI还是逻辑。如果你非要分割的话,那很有可能你就会得到两倍的代码,而你新增的耦合层也异常巨大。
    事实上不同的UI框架都致力于改善这种局面,qt使用槽,cocoa使用绑定,都在朝一个方向解决:UI能响应逻辑,并且是透明的。也就是说,如果你按钮的颜色是跟随着某个变量而改变的,那么当你这个变量的值改变时,按钮的颜色自动改变,而无需在按钮的listener中去手动的调用 btn.setcolor,这一切都是透明的。
    另外,从更高的角度讲,即便真要引进一个所谓的框架的话,我也建议使用代理而非反射的机制。接口!接口编程才是方向。
      

  32.   

    这种想法到时可以的,但是毕竟手机处理能力有限不像PC机那样。android运行应用程序尽量求简洁,一些java里面设计先进理念在这里可能行不通的,android系统在设计时就是遵循MVC设计模式的。
      

  33.   

    titanium 我用过做开发,开发得很痛苦,用JS业务.没有什么层级关系.
    原理其实就是TI自己有个解析器,去解析我们写的JS.这些JS暴露在assets目录下
    看TI的AndroidManifest.xml看出,他就只有几个activity,然后把每个JS当做一个VIEW的动态生成.
    思想是很好.可是TI还有待完善,公司做的3个TI的项目本来做还好,但后来发现,对日益增加的需求,不能很好的响应.
      

  34.   

    刚刚接触Android,看看大家的看法
      

  35.   

    强烈要求leemiki分享一下先在的研究成果!你的思路是什么?
      

  36.   

    我的项目中在view那里会注入,不然老是findViewByid,还有就是网络查询的时候,会切一个对话框,其他用的不多
      

  37.   

    spring不是出了spring for android吗
      

  38.   

    加载spring ,太费时间了,本来通过反射技术加载类都比较费时间
      

  39.   

    我做过的一个数据采集客户端项目,其中有借鉴了spring的bean工厂模式,比如把业务逻辑的类放在在res的array.xml中做到可配置,自己通过反射加载。对于服务端下发的数据,处理完业务后,用广播去通知UI的更新,也算是业务和UI分离了吧。个人感觉android做客户端业务也不是很复杂,借鉴ee方面的一些思想还是挺不错的,不过如果去死扣那些设计模式之类的,感觉没啥必要,没时间,呵呵。菜鸟乱语,高手轻拍哈~
      

  40.   

    。。
    感觉LZ想法不错,但目前android手机的硬件配置来看,暂时不是特别需要。而且现在android的应用很多还是类似作坊式的生产。
    不过以目前android手机硬件的发展来看,而且android未必一定用在手机,其他嵌入式设备也可使用,所以以后这类框架的出现也是一个必然的趋势。
      

  41.   

    想法不错,有可能这样发展,以后。估计google的人也在考虑这个问题
      

  42.   

    楼主可以考虑下把Spring移植到ANDROID上啊,呵呵,不过,我觉得没有必要把事情变得太复杂。你只是做个客户端
      

  43.   

    web的框架不适合android,如果想实现依赖注入,需要自己写一个简单的编程框架。spring需要读取配置文件,光凭这点,就不赞成使用。
      

  44.   

    个人认为
    安卓现在比苹果差就差在系统及应用的流畅度上
    我二者都在做,对这个深有体会
    你可以让你的代码更条理但是不要让他们更臃肿,这样有利于你的开发同时也有利于运行的流畅度。
    框架过于臃肿,冗余代码太多,个人认为不适合加入到手机客户端中。
    况且像安卓不同分辨率不同配置的机型执行APP的能力也不同,所以保证最大的通用性才是目前最该考虑的事情。
      

  45.   

    有必要用spring么? android本身的架构已经基本可以做到定制了.
      

  46.   

    是要考虑扩展性,但扩展性实现有很多方法,要看项目的规模和性能要求而定。
    如果扩展性好了,根本跑不起来,或者用户体验很差,那这项目也是失败了----------------------------
    http://www.purji.com/
      

  47.   

    这个···高手好多,听不懂···本人只是学了JAVA的面向对象然后学的Android,还没有考虑这么深的问题···大家讨论,我观望···
      

  48.   

    竟然翻出来这样一个经典的老帖子,赞一个!接触了一段时间的spring框架后在做android,产生了和楼主一样的想法,看到楼上那么多大牛的回复,真的学习了!