|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果同时支持iOS5和iOS4用宏判断下就可以当然也可以直接用assign)还有一点开始学习的时候肯定很疑惑内存管理是基于函数名称的比如带alloccopy的函数用了之后返回的对象一定要release自打仗Android以来,我一向在寻觅一种对照强健的开辟办法。比如制止在UI线程举行IO操纵,避免反复的收集哀求,对主要数据举行缓存而且正确的更新这些缓存等等。固然,代码布局也要坚持只管明晰。
本文并非给你供应一个威望精准的办理计划,更多的是往切磋在天真性、可读性和强健性之间有着很好均衡的App的一种开辟体例。
一些现有的办理计划
在Android的早期版本,很多人处置多义务时会选择AsyncTask。大致下去说,AsyncTask十分难用,很多文章也提到了它的成绩。厥后,Honeycomb(3.0)引进了可设置性更好的Loaders。到了2012年,基于AndroidService的开源项目Robospice问世,带来了新的办理计划,这里先容了Robospice的事情道理。
Robospice比起AsyncTask切实其实好太多了,可是仍然存在一些成绩。好比上面这段罕见代码,经由过程Robospice在Activity中倡议一个哀求的历程。你其实不必要细读,只需有个也许的观点就好:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FollowersRequestrequest=newFollowersRequest(user);
lastRequestCacheKey=request.createCacheKey();
spiceManager.execute(request,lastRequestCacheKey,
DurationInMillis.ONE_MINUTE,
newRequestListener<FollowerList>{
@Override
publicvoidonRequestFailure(SpiceExceptione){
//Onsuccess
}
@Override
publicvoidonRequestSuccess(FollowerListlistFollowers){
//Onfailure
}
});
然后是哀求的详细代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
publicclassFollowersRequestextendsSpringAndroidSpiceRequest<FollowerList>{
privateStringuser;
publicFollowersRequest(Stringuser){
super(FollowerList.class);
this.user=user;
}
@Override
publicFollowerListloadDataFromNetwork()throwsException{
Stringurl=format("https://api.github.com/users/%s/followers",user);
returngetRestTemplate().getForObject(url,FollowerList.class);
}
publicStringcreateCacheKey(){
return"followers."+user;
}
}
存在的成绩
- 你必要为每一个哀求都做上述的处置,代码会显得很痴肥:
-关于你的每种哀求你都必要承继SpiceRequest写一个特定的子类。
-一样的,关于每种哀求你都必要完成一个RequestListener来监听。
-假如你的缓存过时工夫很短,用户就必要花较长工夫守候你的每一个哀求停止。
-RequestListener持有了Activity的隐式援用,那末是否是还必要内存保守的成绩。
综上,这并非一个很好的办理计划。
五步,让程序简便而强健
在我入手下手开辟Candyshop的时分,我实验了其他的办法。我试图经由过程夹杂一些具有风趣特征的库来机关一个复杂而强健的办理计划。这是我用到的库的列表:
*AndroidAnnotations用来处置背景义务,EBean等等……
*SpringRestTemplate用来处置REST(含形态传输)的收集哀求,这个库和AndroidAnnotations共同的十分好。
*SnappyDB这个库次要用来将一些Java对象缓存到当地文件中。
*EventBus经由过程EventBus来解耦处置App外部组建间的通信。
下图就是我将要具体解说的全体架构:
<br>
第一步一个易于利用的缓存体系
你一定会必要一个耐久化的缓存体系,坚持这个体系尽量复杂。
1
2
3
4
5
6
7
@EBean
publicclassCache{
publicstaticenumCacheKey{USER,CONTACTS,...}
public<T>Tget(CacheKeykey,Class<T>returnType){...}
publicvoidput(CacheKeykey,Objectvalue){...}
}
第二步一个切合REST的Client
这里我经由过程上面的例子来讲明。记得要确保你利用RESTAPI放在统一个中央。
<p>1
2
3
4
5
6
7
8
9
10
<p> |
|