|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
多线程问题还有胶水代码的问题建立一个基于CoreData的工程你会看到他自动创建3个类的对象NSManagedObjectModel管理数据的存储结构文件扩展名是xcdatamodeldNSPersistentStoreCoordinator用来管理底层数据的存储用官方的话说CoreDataisnotarelationaldatabaseorarelationaldatabasemanagementsystem(RDBMS)写在后面的话:
这篇文章是前FirefoxAndroid工程师(如今跳槽往Facebook了)LucasRocha所写,文中对Android中经常使用的四种自界说结构计划举行了很好地剖析,并分离这四种Android自界说结构计划所写的示例项目解说了它们各自的好坏和四种计划之间的对照。看完这篇文章,也让我对Android自界说结构有了进一步的懂得,因而趁着兴头,我把它翻译成中文,原文链接在此。
只需你写过Android程序,你一定利用过Android平台内建的几个结构——RelativeLayout,LinearLayout,FrameLayout等等。它们能匡助我们很好的构建AndroidUI。
这些内建的结构已供应了良多便利的构件,但良多情形下你仍是必要来定制本人的结构。
总结起来,自界说结构有两年夜长处:
- 经由过程削减view的利用和更快地遍历结构元素让你的UI显现加倍无效率;
- 能够构建那些没法由已有的view完成的UI。
在这篇博文中,我将完成四种分歧的自界说结构,并对它们的优弱点举行对照。它们分离是:compositeview,customcompositeview,flatcustomview,和asynccustomviews。
这些代码完成能够在我的github上的android-layout-samples项目里找到。这个app利用下面说到的四种自界说结构完成了不异的UI效果。它们利用Picasso来加载图片。这个app的UI只是twittertimeline的简化版本——没有交互,只要结构。
好啦,我们先从最多见的自界说结构入手下手吧:compositeview。
CompositeView
Compositeviews(也被称为compoundviews)是浩瀚将多个view分离成为一个可重用UI组件的办法中最复杂的。这类办法的完成历程是如许的:
- 承继相干的内建的结构。
- 在机关函数内里添补一个merge结构。
- 初始化成员变量并经由过程findViewById()指向外部view。
- 增加自界说的API来查询和更新view的形态。
TweetCompositeViewcode就是一个compositeview。它承继于RelativeLayout,并添补了tweet_composite_layout.xmlcode结构文件,最初向外界表露了update()办法来更新它在adaptercode内里的形态。
CustomCompositeView
下面提到的TweetCompositeView这类完成体例能满意年夜部分的情形。可是碰着某些情形就不灵了。假定你如今想要削减子视图的数目,让结构元素的便当加倍无效。
这个时分我们能够回过火来看看,只管compositeviews完成起来对照复杂,可是利用这些内建的结构仍是有很多的开支的——出格是LinearLayout和RelativeLayout这类对照庞大的容器。因为Android平台内建结构的完成,在一次结构元素遍历中,体系必要处置很多结构的分离和子视图的屡次丈量——LinearLayout的layout_weight的属性就是罕见例子。
因而你能够为你的app量身定做一套子视图的盘算和定位逻辑,如许的话你就能够极年夜的优化你的UI了。这类做法就是我接上去要先容的customcompositeview.
望文生义,一个customcompositeview就是一个重写了onMeasure()和onLayout()办法的compositeview。因而比拟之前的compositeview承继了RelativeLayout,如今我们必要更进一步——承继更笼统的ViewGroup。
TweetLayoutViewcode就是经由过程这类手艺完成的。注重如今这个完成不像TweetComposiveView承继了LinearLayout,这也就制止了layout_weightcode这个属性的利用了。
这个年夜费周折的历程经由过程ViewGroup’s的measureChildWithMargins()办法和面前的getChildMeasureSpec()办法盘算出了每一个子视图的MeasureSpec。
TweetLayoutView不克不及准确地处置一切大概的layout组合可是它也不用如许。我们一定必要依据特定需求来优化我们的自界说结构,这类体例可让我们写出复杂高效的结构代码。
FlatCustomView
如你所见,customcompositeviews能够复杂地经由过程利用ViewGroup的API就能够完成了。年夜部分时分,这类完成是能够满意我们的需求的。
但是我们想更进一步的话——优化我们使用中的关头部分UI,好比ListViews,ViewPager等等。假如我们把一切的TweetLayoutView子视图兼并成一个单一的自界说视图然后一致办理会怎样呢?这就是我们接上去要会商的flatcustomview——参看上面的图片。
<br>
右边为CUSTOMCOMPOSITEVIEW,右侧是FLATCUSTOMVIEW
flatcustomview就是一个完整自界说的view,它完整卖力外部的子视图的盘算,地位布置,绘制。以是它就间接承继了View而不是ViewGroup。
假如你想找找实际生存中app是不是存在如许的例子,很复杂——开启你手机“开辟者形式”内里的“显现结构界限”选项,然后翻开Twitter,Gmail,大概Pocket这些app,它们在列表UI内里都接纳了flatcustomview。
利用flatcustomview最次要的优点就是能够极年夜地紧缩app的视图层级,进而能够举行更快的结构元素遍历,终极能够削减内存占用。
Flatcustomview能够给你最年夜的自在,就仿佛你在一张白纸下面作画。可是如许的自在是有价值的:你不克不及利用已有的那些视图元素了,好比TextView和ImageView。没错,在Canvas下面刻画文本切实其实很复杂,但要你完成ellipsizing(就是对太长的文本截断)呢?一样,在Canvas下面刻画图片确很复杂,可是怎样缩放呢?这些限定一样合用于touchevents,accessibility,keyboardnavigation等等。
以是利用flatcustomview的底线就是:只将flatcustomview使用于你的app的UI中心部分,其他的就间接依附Android平台供应的view了。
TweetElementViewcode就是flatcustomview。为了更简单的完成它,我创立了一个小小的自界说视图框架叫做UIElement。你能够在canvascode这个包里找到它。
UIElement供应了和Android平台相似的measure/layoutAPI。它包括了没有图象界面的TextView和ImageView,这两个元素包括了几个必须的特征——分离参看TextElementcode和ImageElementcode。它还具有本人的inflatercode,匡助从结构资本文件code内里实例化UIElement。
注重:UIElement还处于十分初期的开辟阶段,以是另有良多缺点,不外未来跟着不休的改善UIElement大概会变得十分有效。
你大概以为TweetElementView的代码看起来很复杂,这是由于实践代码都在TweetElementcode内里——实践上TweetElementView饰演托管的脚色code。
TweetElement内里的结构代码和TweetLayoutView‘十分相似,可是它利用Picasso哀求图片时却纷歧样code,由于TweetElement没有利用ImageView。
AsyncCustomView
总所周知,AndroidUI框架时单线程的。如许的单线程会带来一些限定。好比,你不克不及在主线程以外遍历结构元素——但是这对庞大、静态的UI是很无益处的。
假设你的app在一个ListView中很结构对照庞大的条目(就像年夜多半交际app一样),那末你在滑动ListView就很有大概呈现跳帧的征象,由于ListView必要为列表中行将呈现的新内容盘算它们的视图巨细code和结构code。一样的成绩也会呈现在GridViews,ViewPagers等等。
假如我们能够在主线程以外的线程下面对那些还没有呈现的子视图举行结构遍历是否是就能够办理下面的成绩了?也就是说,在子视图下面挪用measure()和layout()办法都不会占用主线程的工夫了。
以是asynccustomview就是一个同意子视图结构遍历历程产生在主线程以外的实行,这个idea是遭到Facebook的Paperteamasyncnodeframework这个视频引发所想到的。
既然我们在主线程以外永久打仗不到Android平台的UI组件,因而我们必要一个API在不克不及间接打仗到这个视图的条件下对这个视图的内容举行丈量、结构。这恰好就是UIElement框架供应给我的功效。
AsyncTweetViewcode就是一个asynccustomview。它利用了一个线程平安的AsyncTweetElementcode工场类code来界说它的内容。详细历程是一个Smoothie子项加载器code在一个背景线程上对临时不成见的AsyncTweetElement举行创立、展望量弛缓存(在内存内里,以便厥后间接利用)。
固然在完成这个异步UI的过程当中我仍是让步了一些,由于你不晓得怎样显现恣意高度的结构占位符。好比,当结构异步传送过去的时分你只能在背景线程对它们的巨细举行一次变动。因而当一个AsyncTweetView就要显现的时分却没法在内存内里找到符合的AsyncTweetElement,这个时分框架就会强迫在主线程下面创立一个AsyncTweetElementcode。
另有,事后加载的逻辑和内存缓存过时工夫设置都必要对照好的完成来包管在主线程尽量多天时用内存内里的缓存结构。好比,这个计划中利用LRU缓存code就不是一个明智的选择。
只管还存在这些限定,可是利用asynccustomview的失掉的开端了局仍是很有出路的。固然我也会经由过程重构这个UIElement框架和利用其他种别的UI在这个范畴持续探究。让我们静不雅其变吧。
总结
在我们触及到结构的时分,我们自界说的越深,我们能从Android平台所能取得的依附就越少。以是我们也要制止过早优化,只在的确能实其实在改良app质量和功能的地区举行完整的结构自界说。
这不是一个非黑即白的决意。在利用平台供应的UI元素和完整自界说的两种极度之间另有良多计划——从复杂的compositeviews到庞大的asyncviews。实践项目中,你大概会分离文中的几种计划写出优异的app。
在python中的函数__xxxNSString字符串NSArray数组NSDictionary字典这些都需要弄很清楚其他的类都是一个套路NSMutableArray这样带Mutable的类代表可变的 |
|