AisenForAndroid - 重构中
Aisen一个免费开源、面向AOP、遵循Apache2开源协议发布的Android轻量级快速开发框架。初衷是将面向互联网应用开发过程中大部分重复工作抽象出来,基于反射注入的方式实现具体业务逻辑,让开发人员更专注于项目的业务或者UI特效,不需要关注架构方面的SDK业务接口封装、网络协议、缓存管理之间的耦合关联,以及UI层面常见刷新控件、分页加载、图片OOM、Adapter优化等最常见的UI工作;
Aisen微博是个人实验性项目,依赖AisenForAndroid开发,UI遵循Material Design,也会在部分功能实现上依赖Github上其他优秀的开源组件或者框架,作为范例让感兴趣的同志更加了解AisenForAndroid或者其他项目的使用。
流程图
UI层
概要说明
1、处理4种基本视图之间的自动切换;
2、统一ListView、GridView、ViewPager等列表容器的刷新逻辑;
3、处理分页加载线程的业务逻辑;
1、ABaseFragment
维护一个主业务线程,通过线程状态的回调,自动维护四种基本视图Loading、Empty、Failure、Content之间的动态切换。
流程图
效果图
2、APagingFragment
2.2.1概要说明
继承ABaseView,扩展Adapter支持,通过子类分页器配置,维护一个分页线程,自动根据刷新状态、分页等参数调度线程刷新服务端的业务数据,将数据自动append到adapter的数据池中刷新列表;支持ListView、GridView、ViewPager等控件的扩展。支持各种上下拉控件的扩展。
在Android端,基本所有的列表容器:ListView、GridView、ViewPager等,都是通过适配器BaseAdapter来操作数据,所以APagingView的工作就是维护好一个Adapter,剥离一个分页接口切面,通过分页器的配置,根据用户上拉、下拉的操作,自动的将分页参数传递给子类,让子类自行调度SDK方法完成数据的拉取,获取到数据后,根据刷新模式自动的完成列表页面刷新。即下拉刷新将数据拼接在adapter数据头部,上拉刷新将数据拼接在adapter数据尾部,reset刷新将数据重置adapter。以上所有的操作自动调度,子类只需要实现已经重用了的ItemView(你理解的ViewHolder),基本一个列表界面3-4个方法搞定。
效果图
ARefreshFragment
ASwipeRefreshListFragment
AListFragment
AStripTabsFragment
AAutoReleaseStripTabsFragment
SDK接口层
将分页、缓存、线程等都归纳在这里
ABizLogic
Cache
Paging
PageIndexPaging
WorkTask
TaskException
网络协议层
IHttpUtility
HttpConfig
Params
开发组件
BitmapLoader
SqliteUtility
使用
1、依赖关系
我只能用这两句话描述了
AisenForAndroid依赖android-support-v7-appcompat
AisenSample依赖AisenForAndroid
2、继承GlobalContext
你的项目Application必须继承自GlobalContext
老的内容,稍后删
UI层
定义Loading、Failure、Empty、Empty、Content5个基本视图。根据异步线程执行的业务方法状态,自动的维护这5个视图之间的状态切换。
效果
解决互联网应用过程中常见的问题,例如:
UI层,定义、管理基本视图的状态切换,封装列表视图的状态控制;
SDK层,申明客户端所有接口方法,定义入参和出参以及业务异常;
Cache层,定义缓存接口,自由配置每个接口的缓存方式;
Network层,定义网络接口,
图片加载框架,一行代码完成图片的加载绑定,优化OOM、错位、压缩、网络开销等问题;
Sqlite的ORM操作组件,基于GreenDAO框架,面向对象的一行代码CRUD操作;
IOC注解,UI组件的绑定,一般性事件设置;
我能做什么
使用ViewInject绑定view
fragment可以
activity可以
adapter的itemview可以
任何地方
BitmapLoader,一行代码加载图片
可以加载web、sdcard、assets、drawable、contentprovider、任何地方
可以裁剪图片、圆角、压缩、任意处理
二级缓存
下载进度回调,开始、错误、进度、结束等事件
其他配置:Displayer、LRU算法
ORM
一行代码针对object的sqlite增删改查操作
http、https
soap
socket
等
接口缓存管理
将接口数据保存为文件
将接口数据保存到db
将接口数据保存到任何你想保存的地方
我还能做什么
Loading视图、Failure视图、Empty视图、Empty视图、Content视图这5中基本视图的切换管理,你什么java代码都不需要写,只需要在layout的xml文件中按照自己的需求绘制5种视图的ui部分,就能
加载数据时显示Loading界面
加载失败显示Failure界面,将faild的提示信息绑定到ui显示,如果有ReloadBtn点击自动刷新
加载空数据显示Empty界面,将empty的提示信息绑定到ui显示,如果有ReloadBtn点击自动刷新
加载成功后显示Content界面
只需实现3个方法,你就做完了一个刷新列表界面(支持三种刷新控件:示例一、示例二、示例三)。它有这些功能:
支持ListView、GridView
上拉刷新、自动加载更多
接口分页加载
自动保存、刷新缓存数据
缓存数据时效过期自动刷新列表
保存阅读位置
资源重用
app运行时切换网络通讯协议
某些项目,根据网络环境切换网络通讯协议,网段内实现p2p的wifi socket协议通讯,网段外与云服务器的http+soap+https协议通讯,或者与硬件交互的bluetooth socket协议通讯等。不管什么协议之间的切换,只需要一行代码动态配置即可
事件传递机制
没有任何耦合,任何异常信息以Exception的形式上报至UI层。UI层只处理异常信息的UI反馈,业务接口层上报业务异常信息(登录失败、表单错误等业务相关),网络通讯层上报通讯异常信息(无网络、连接超时等)
4层结构,层与层之间低耦合,恪守单一职责原则,面向AOP
UI层,处理ui上的特效、事件、基本的业务逻辑处理
SDK层(业务接口层),规范所有与服务端通讯的接口定义,包括定义方法的入参、出参、异常
HttpUtility层(网络通讯层),实现app所支持的网络通讯协议
CacheUtility层(持久层),针对业务接口的数据持久管理
ORM(SqliteUtility)
假设你已经熟悉sqlite操作,那么,SqliteUtility的相关api方法就不需要再说太多。同样面向对象,一行代码对数据库进行增删改查操作,但是剔除了一对一或者一对多这些操作,更多的示例代码请查看SqliteUtility 。
IOC(ViewInject)
继承BaseActivity、ABaseFragment等均可以使用ViewInject对属性自动装配,可以给view设置点击事件,像这样
@ViewInject(idStr = "layoutLoadFailed", click = "reload")
View loadFailureLayout;// 加载失败视图
或者像ItemView,也可以自动绑定,像这样
public class TimelineItemView extends AbstractItemView
implements OnClickListener {
@ViewInject(id = R.id.imgPhoto)
ImageView imgPhoto;
@ViewInject(id = R.id.txtName)
TextView txtName;
...
}
目前只支持click事件,我是个很实在的人,确实还没有遇到其他例如OnLongClick事件需要绑定就没有添加支持。
BitmapLoader
请使用这一行代码加载图片
BitmapLoader.display(BitmapOwner owner, String url, ImageView imageView, ImageConfig ImageConfig)
依赖工程
License
Copyright (c) 2014 Jeff Wang