
Desigin & Struct
文章平均质量分 75
fyfcauc
这个作者很懒,什么都没留下…
展开
-
简单动画系统随笔
最近重构动画系统,虽然只是一个小系统,不过在设计的过程中发现自己在宏观层面的架构搞惯了,这种体量小却结构精巧(和宏观层比就像从模块间到模块内)的也有一定考验性。架构本身不分大小,在一些基本原理上是一致的。随笔记录自己的一些思路和想法:一个抽象动画过程Animation应该有这些通用的属性/接口: 动画状态 (初始/运行/暂停/停止/结束),结束和停止在结果表现上看似乎比较相近,但是因为其对应的现原创 2017-11-17 11:17:10 · 782 阅读 · 1 评论 -
DownLoad模块 (一)
DownLoad模块 (一)DownLoad abstarct Class 实现了Comparable:这个类的定位基本就是该次DownLoad所有信息的聚合体,并且作为一个基类的角色存在,在抽象上就是一个DownLoad。虽然倾向于一个纯粹的数据结构,不过还是定义了一些行为.在MVC中的角色是 一个 重M+轻C并且其外部行为也就是发出一个事件,然后其他的Listene原创 2015-02-17 11:02:44 · 565 阅读 · 0 评论 -
DownLoad模块 (四)
DownLoad模块 (四)DownloadConfirmDialogPagerAdapter是为ViewPager所使用的PageAdapter,直接extends自PagerAdapter并且也不符合FragmentPagerAdapter适用的场合, FragmentPagerAdapter以及FragmentStatePagerAdapter还没有使用过> 该类将I原创 2015-02-27 16:48:53 · 603 阅读 · 0 评论 -
DownLoad模块 (五)
DownLoad模块 (五)DownloadItemView代表DownloadFragment上每一个Download对应的View,展示该Download的进度,状态,名称等信息。设计为base abstarct class。DownloadItemView直接extends LinearLayout, 又承担一部分的C,实现了onClickListener和 onLongCl原创 2015-02-27 17:49:54 · 647 阅读 · 0 评论 -
Download模块 (八)
Download模块 (八)KeyPressListener是一个体系,而不是一个单独的类,目的也很简单,就是一套传递keyPress信息的机制。这么做的原因是对于fragment这些非UI对象,是没有监听keyPress的功能的,而fragment虽然不是UI对象,但是UI对象的所有处理逻辑都在fragment中,因此fragment也需要能够感知keyPress。虽然当前原创 2015-02-28 11:39:07 · 538 阅读 · 0 评论 -
Download模块 (九)
Download模块 (九)DownloadsFragment类是负责展现当前Download信息的fragment, 按照需要extends FullscreenFragment,同样遵循惯例,实现了几个Listener 作为 C 的聚合. DownloadsFragment自身所展示的View比较简单,不过里面有一个container view, 该container vi原创 2015-02-28 14:57:57 · 650 阅读 · 0 评论 -
Download模块 (十四)
Download模块 (十四)DownloadThread extends thread, 承载了真正通过http下载数据的任务。Thread的一个问题是,其他thread对thread其实没有完全的控制权,interrupt方法只是改变一个flag,只有在Thread 的run的interrupt定义检测点才能实现对Thread的控制,这也注定了,基本不可能同步的控制一个th原创 2015-03-03 13:42:07 · 565 阅读 · 0 评论 -
Download模块 (十五)
Download模块 (十五)DownloadInfo实现了Parcelable,顾名思义,封装了一个Download的所有必要信息,信息足够使接收端构造出合乎发送端需求的DownloadTask。并且Info在接收端也会承载起M的角色,所有也会有一些setter来更新其信息。实现了Parcelable接口:(1)describeContents()直接返回0即可。原创 2015-03-03 15:05:48 · 568 阅读 · 0 评论 -
Download模块 (十六)
Download模块 (十六)Notification类算是一个比较独立的模块以及一个工具性的C+V角色比较好>。所有方法都是static的,类实际搞成一个static的都可以。或者单例模式。构造函数直接privateNotification内部没有实现什么listener,设计的时候不想让Nofticiation主动感知Download,而是应该作为一个被动的工具被调用。原创 2015-03-03 16:28:12 · 572 阅读 · 0 评论 -
Tab 模块 (三)
Tab 模块 (三)TabContainer作为一层layout的存在有些浪费的,是当时应急为了实现调整tabViewList的gravity而作为layout添加的.TabContainer完全可以作为TabMenu的一部分或者一个组件存在.TabContainer逻辑上也是一个中间层的角色,上下传达消息.TabMenu的一部分C逻辑被分在了TabContaine原创 2015-03-07 14:22:37 · 618 阅读 · 0 评论 -
Browser 架构
公司产品的一个架构,这个架构是外国总部那边就设计好的,在这边唯一的一次比较大改动是一个牛人引入了HistoryPart结合ViewPager实现了滑动的前进后退。 ProxyBrowserView 在被构造的时候会被传入BrowserManager, 一个 ProxiedBrowserView,以及一个HistoryPart, 如果没有给HistoryPart,那么会new 一个 Hist原创 2015-03-17 16:58:30 · 1327 阅读 · 0 评论 -
ActiveAndroid 源码阅读笔记 (2)
5.TableInfo: (1)内部引用: 一个Type, 该Type限制了Class必须extends Model, Table名称,Id名称, 一个Field对象和String的HashMap 对象的Field的对应关系>. (2)构造函数接受一个Class type(必须extends Model), 尝试获取此Class type的 Ann原创 2015-04-28 18:13:32 · 659 阅读 · 0 评论 -
关于RecyclerView的一些概念
在使用RecyclerView或者阅读其源码前最好明确一些术语代表的概念,脱离具体实现细节,在抽象设计层思考RecyclerView 背后的模型。先以RecyclerView的一个表现形式,一个可以上下滑动的列表作为切入点: 我们为什么偏向使用ListView/RecyclerView而非ScrollView+LinearLayout作为列表的实现方案? 因为列表的长度可能是很长的。从理想的使用原创 2017-01-12 16:32:51 · 972 阅读 · 0 评论 -
RecyclerView机制分析: State
State是最简单的RecyclerView子模块。RecyclerView在工作过程中,需要维护一系列状态信息(比如当前处于Layout的哪个阶段,是否处于preLayout阶段等)。并且因为RecyclerView将功能进行了子模块化,还需要传递某些信息到特定子模块来完成功能/通信,RecyclerView把这部分职责集中到了State模块中。State**内部聚合了所需的各项状态信息,扮演了原创 2017-01-11 15:04:44 · 3120 阅读 · 0 评论 -
项目网络层重构总结
引入网络抽象层,主要包括以下部分:Request: 通用的Request的实现结构,承载如下职责: 网络请求信息的承载和封装。为Interceptor提供切面回调。为第三方库的Request**具体实现提供桥接接口。**Sender: 对网络请求发送的抽象,为第三方库的发送请求(以及一些请求控制方法)提供实现接口。Interceptor: AOP,对Request的各项回调进行interc原创 2016-11-04 16:13:40 · 560 阅读 · 0 评论 -
EventBus 源码笔记(1)
EventBus ThreadMode:PostThread: Subscriber的calback和post在一个线程,默认设置. 这样可以减少线程切换的开销,也是对于比较简单的需求的推荐设置. EventHandler中的Callback不建议执行blocking很长时间的操作,因为有可能callback会在主线程上执行.MainThread: 所有Subscriber的callback都会运原创 2015-08-27 18:45:23 · 574 阅读 · 0 评论 -
UniversalImageLoader 源码笔记(1)
UniversalImageLoader:ImageDownloader接口:定义了getStream(…)接口, 这个抽象屏蔽了所有image来源以及如何提取的细节, 统一为一个返回InputStream的接口.以enum形式定义了支持的几种Scheme, 还集成了剥离url scheme的方法.BaseImageDownloader implements ImageDownloader:根原创 2015-08-25 12:19:08 · 484 阅读 · 0 评论 -
Android Loader机制 源码笔记(1)
LoaderManager: 1. HONEYCOMB引入的新工具类, 可以和Activity或者Fragment相关联, 并且能够同时管理复数个loader, 最常用的就是CursorLoader这个类,当然了,欢迎自己定制loader.内部定义了一个load操作的callback类: LoaderCallbacks:Loader onCreateLoader(int id, Bundle a原创 2015-06-16 17:02:44 · 499 阅读 · 0 评论 -
Android Fragment 体系源码跟踪笔记(1)
FragmentManagerState implements Parcelable, 就是之前说的在save state时,用来保存FragmentManager本身state的容器,其内部的成员也都是各种信息的holder: FragmentState[] mActive;: 保存当前Active的Fragment的state.int[] mAdded: 保存已经被Add进去的Fragmen原创 2015-05-07 16:43:05 · 668 阅读 · 0 评论 -
Download模块 (二十)
Download模块 (二十)RemoteDownloadProvider 和 之前的localDownloadProvider一样,实现了同样的接口,负责提供网盘转存模式下的UI提供与展示以及对交互逻辑的封装。和local一样,网盘当前已经转存的资源和正在转存的任务 都对应着一个内存中的Download对象下面主要列的是不同点。监听了大量的网盘转存相关event:原创 2015-03-04 22:35:58 · 599 阅读 · 0 评论 -
Download模块 (六)
Download模块 (六)DownloadManager是一个重M+轻C的角色。内部维护了所有Download的信息聚合,并围绕此信息聚合提供一些查询类的功能,也有一些C操作。DownloadManager 是一个单例模式的类,类载入时直接初始化一个sInstance.DownloadManager其实也可以完全设计为一个static类,不过从其语义和定位考虑,一个man原创 2015-02-27 22:18:45 · 550 阅读 · 0 评论 -
Download模块 (十)
Download模块 (十)DownloadPagerAdapter是一个简单的基于PagerAdapter的类,定位很明确,就是为DownloadFragemnt中的ViewPage提供adapter。 因为将大量的逻辑外包给了View的provider,因此DownloadPagerAdapter本身的逻辑功能除了必须override的以外不多。DownloadPagerA原创 2015-02-28 15:30:09 · 484 阅读 · 0 评论 -
Download模块 (十二)
Download模块 (十二)LocalDownloadResourceProvider implements了 DownloadPageProvider.并且还封装了几乎所有create的view的逻辑交互.LocalDownloadResourceProvider还定义了几个要显示的View类。LocalDownloadResourceProvider把V部分也给承包了。原创 2015-03-02 11:53:28 · 685 阅读 · 0 评论 -
Tab 模块 总结
Tab 模块总结从整体上对TabMenu这个模块的一些设计分析:为了实现全屏推拉TabMenu,MovingMenu是叠在mainUI上面的,两者都在一个FrameLayout中,并且MovingMenu都是match_parent来实现了全屏覆盖.MovingMenu作为FrameLayout,本身没有设置backGround,因此是透明的,而里面的两个View组件,原创 2015-03-09 18:47:28 · 1652 阅读 · 0 评论 -
Wallpaper模块(2)
Wallpaper模块(2):WallPaperFragment extends ButtonReceiveFragment,后者是项目的一个基础类,作用很简单,在被attach到某个Actviity时,如果Actviity是一个ButtonProvider,那么该fragment就会将自己register到该Activity以在Activity收到onKeyDown时,会被通原创 2015-03-13 16:54:22 · 821 阅读 · 0 评论 -
Android Bitmap资源的简单池化
Android Bitmap资源的简单池化说一下Bitmap池化的原因: Bitmap在内存中的体现基本就是一大块的内存,当然还有对应的类的数据,这就造成了Bitmap的create 以及在被dalvik GC的时候会付出比较大的时间代价.池化说白了就是空间换时间,开辟一个回收池,作为一个中间层,可以减少真正create和GC的次数.为了池化Bitmap,直接使用bit原创 2015-03-12 11:27:24 · 986 阅读 · 0 评论 -
Download模块 (十一)
Download模块 (十一)DownloadService,该service是为了实现APP切换到后台仍可以下载而实现的, 这也是Android所提倡的一种后台处理方式。该Service因为会和MainActivity这一端频繁交互,因此设计成为了bind的service.而同时在系统的Notification栏中也会有复数个不可撤销的Notification与此Servic原创 2015-03-01 19:39:42 · 953 阅读 · 0 评论 -
Wallpaper模块(一)
Wallpaper模块(1)Picker是一个用于从交互的选取图片类的Activity中获得所选图片的类. Tool.对外开放Listen接口,取图成功和取图失败.Picker因为定位是一个tool,因此设计为单例模式,load Class 即生成实例. early-init.因为Picker其实只在WallPaper模块被使用,因此在设计的时候没有考虑pendin原创 2015-03-13 15:28:10 · 818 阅读 · 0 评论 -
Download 项目总结
Download 项目总结.每一层的View只监听自己感兴趣的event,也基本只操作自己View内的直接子元素,当然不排除它进一步触发自己的View变化event,以及对自己内部的子view的操作。一个event的影响流可以是 (1)挨个遍历 要影响的 V/M ,这样做的好处 每个V/M的影响处理逻辑可以尽可能的封装在自己内部,不过这中方式一般是比较小范围,或者没有更原创 2015-03-05 15:17:28 · 529 阅读 · 0 评论 -
Tab 模块 (一)
Tab 模块 (一)做该模块的时间早于Download.MoveMenu extends FrameLayout, 可以响应手势或者按钮出现/消失. 提供了几种手势滑动方向,并且是可以set的并且在APP的setting中持久化.手势滑动方向被enum化:UNDEFINED,LEFT,RIGHT,LEFT_RIGHT,FORBID_DRAG,原创 2015-03-06 13:59:32 · 1118 阅读 · 0 评论 -
Dragger模块
Dragger模块Dragger模块是项目的一个base模块,用于实现对所挂接View的drag位移.这个模块设计的理念很好,体现了V 和 C 完全独立分离的思想,随便一个View,被Dragger挂接上即可在parent内跟随Touch移动.其实本质上就是之前Tab模块中封装的TouchController,只不过这里直接将其独立出去,将要drag的View也作为To原创 2015-03-11 21:28:47 · 685 阅读 · 0 评论 -
Tab 模块 (四)
Tab 模块 (四)TabViewListView是真正负责显示TabView,以及相关TabView交互的View,extends AdapterView, 使用AdapterView而不是更为现成的ListView的原因是,ListView虽然在展现List方面很方便很现成,但是ListView不支持对某个ListItem的Touch复杂交互,要在ListView的基础原创 2015-03-08 17:44:10 · 686 阅读 · 0 评论 -
Tab 模块 (二)
Tab 模块 (二)一个TabMenu也是由一组View组成的,因此 extends了LinearLayout,而为了模拟拖拽某个TabView到tabMenu外,和TabMenu同一级的还有一个用于代表托拽时的TabView的辅助性View.平常不可见,只有在托拽某个TabView时,才会截取TabView的内容到自己,然后显示在相应的托拽位置,并响应以后操作.项目中经常原创 2015-03-06 17:36:26 · 923 阅读 · 0 评论 -
Tab 模块 (五)
Tab 模块 (五)TabViewListAdapter extends BaseAdapter.Adapter承载了M和C的角色, 同时因为自己实现的ListView没有实现convertView机制,因此在Adapter里面搞了一套View cache机制来提升性能.而由此也引入了ViewHolder这个优化手段,直接将View的每个子View的引用也用这种方式ca原创 2015-03-09 14:26:17 · 694 阅读 · 0 评论 -
DownLoad模块 (二)
DownLoad模块 (二)FolderBrowser是一个相对独立的模块,其作用就是展示一个可以显示文件内容并且可以前进后退交互的对话框.结合其定位,决定使用Fragment来实现FolderBrowser, 直接使用dialogBuilder应该也可以,但是android guide中建议此类使用DialogFragment来实现。DialogFragment与Fragment原创 2015-02-27 11:43:57 · 546 阅读 · 0 评论 -
Download模块 (七)
Download模块 (七)FullscreenFragment类,基础类, 如同其名,是一个会占据APP整个UI的fragment,注意这里的Fullscreen和系统没有任何关系,并不是用了什么trick来隐藏系统的状态栏使得fragment占据整个屏幕,Fullscreen的意义只是对app本身来说的。在设计APP的整体layout时,用FrameLayout将所有的View原创 2015-02-28 10:44:12 · 448 阅读 · 0 评论 -
Download模块 (十七)
Download模块 (十七)DownloadProxy是和DownloadService配对存在的,负责维护mainActivity和downloadService的通信交互。DownloadProxy不是一构造就立刻启动DownloadService,而是将启动Service放在一个init函数中,出于防止反复初始化,增加一个flag标记,如果当前还没有bind Downl原创 2015-03-03 18:33:30 · 1026 阅读 · 0 评论 -
Download模块 (十八)
Download模块 (十七)RemoteDownload类继承自Download,反应一类比较特殊的Download,即将资源转存至网盘。这种情况下不会发生本地的IO交互。event的触发都是由网盘提供的API负责。网盘会为本次的转存任务分配一个ID,因此要增加一个Rid。不可以pauseequals 和 compareTo也会被override增加了一个原创 2015-03-04 15:35:18 · 664 阅读 · 0 评论 -
Java 一种Impl类的封装方法
有时候会有这样一种需求:一个baseClass有一个static的getInstance方法,而在该基类中又定义了几种定位不同需求extends自此类的subClass未知的>,然后基类的getInstance方法根据不同情况返回不同的subClass子类实例,因为都是extends自baseClass,所以可以被按照baseClass的契约来使用.上面的说白了就是一个简单的工厂模式.原创 2015-03-12 10:19:57 · 3309 阅读 · 0 评论