在j2ee混迹了近两年,正式进入了android行列,不知是何出入,坚持一年先!
在这两年间,收获还是很多,认识很我最好的朋友们,同事间融洽的关系无比温馨,我们无所不谈。但是,后来,他们一个一个都慢慢离去,只剩下我,感觉公司已经变了,一天都呆不下去。做在公椅上转来转去,屁股变尖似的。但最终,我也走上了这条路--辞职
之前只是有几个模糊的方向。但心中还有点割舍不了对应用服务器的情谊。如果继续做此行业,只能是跳往Oracle , IBM 这样寥寥几家, 但确实是实力有些不济,特别是英语口语这个硬砍!辞职又是在年关,找朋友介绍地方,在年前又没反应,为了自己过个好年,就再应聘的几家,这点上觉得确实有些草率,本开始是想找个知名度高,技术含量高的企业进去,但在年前没等到好的企业机会,只有hp 给我电话面试了一次,就没回音了,问了些用的很频繁的问题,spring ,sql ,单单对此又没什么研究,一直在研究JDK ,所以只能遗憾路过,欣慰的是每面试的企业,都希望我能留下,但谈工资有偏差。两年的经验在北京9K算是最普通的吧,不过也可能是我对spring 和 SQL 了解太少,没有其他行业背景,最有可能的是我还没有用足够的技术分析KO面试官。
最终双方合意的OFFER有几份,方向有电子商务,手机互联网,android。最后跳了个最低薪水的android,因为:这个公司美女真多!哎,有钱不赚,非要看美女,有时候真是觉得自己那个什么。。
由于公司一些知名BLOG和门户都被墙了,所以在这里写blog。javaeye V5
概念介绍
这里的闭包自然是计算机语言中的闭包,词法闭包(Lexical Closure)的简称,主要表现在函数可以引用到自由变量,并且可以脱离变量的创建环境,再复杂的定义也不需要多说明了,可以理解为面向对象里面的成员 函数可以调用其成员变量,然其概念却比面向对象的概念流行早的多,约六十年代在Scheme里就实现了。函数式编程语言里这是极为常见的概念,而非函数式 的语言中js里也有很多闭包出现的身影。
Objective-c的闭包
准确地说在Objective-c里不叫闭包(Closure)而叫Block,但概念还是大同小异的。Mac平台上需要LLVM的支持,总之较新 的Xcode都是支持这个特性的。 自由变量在使用是需要用__block关键字定义,而闭包函数的形式与函数指针非常接近,简单地说把函数指针的*换成^就可以了
typedef int (^IntBlock)(); IntBlock downCounter(int start) { __block int i = start; return Block_copy( ^int(){return i--; }); } IntBlock f = downCounter(5); printf("%d", f()); printf("%d", f()); printf("%d", f()); Block_release(f); }
是这么简单。
闭包应用
单纯就语法而言,闭包并没什么好谈的,但它的应用已经越来越广,特别是iPhone新的GCD特性,广泛使用了闭包,如果不知到闭包怎么写,就会陷 入明明系统提供了接口却无法调用的尴尬境地。 可能会觉得,出了系统接口必须要用block而不得不使用的情况外,其他时候直接用函数指针不就得了,实际上除非你真的用到了自由变量,其他时候 block和函数指针确实没什么区别,但block也有自己的独到之处。 首先它不需要事先定义函数,如果是函数指针那么必须要把指针指向一个函数,而函数必须要定义,闭包则不然,直接对代码块就可以调用 其次就算已经事先定义好了函数,只要对函数名取一下^即可直接放到闭包的地方使用,可以理解为向下兼容吧。 比如iPhone的动画效果,你必须先开始动画,然后写你想要动画的操作,最后提交,而开始动画和提交之间的鸿沟没法很好的协调,相当于这样
[self beginAnimation]; [self animationAction]; [self endAnimation];
而且每个动画都必需事先起专门的animationAction,而iPhone的动画效果实在是个很平常的操作,这就多出了无数冗余函数,即使它只是一行hidden之类,而且也不方便扩展,闭包就很适合这种需求
+ (void)animation:(NSTimeInterval)duration withEvent:(animationEvent)event { [UIView beginAnimations:@"animationID" context:nil]; [UIView setAnimationDuration:duration]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; [UIView setAnimationRepeatAutoreverses:NO]; event(); [UIView commitAnimations]; } [Tools animation:0.8 withAnimationCurve:UIViewAnimationCurveEaseInOut withEvent:^{[ UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:centerView_ cache:YES]; // 移除功能列表 [menuView_ removeFromSuperview]; // 增加二次拔号键盘 [centerView_ addSubview:phonePad_ ]; } ];
当然了,闭包最重要的概念还是自由变量什么的,可惜我一直没法理解,这里仅仅是拿它当快捷的函数包裹来使用了。
假如需要在两个activity间传递数据,我们通常都是用Bundle,但是里面似乎只有一些放置一些Java中已经有的数据类型,像String,int,double等,但如果要传递一个对象呢?不难发现Bundle中有一个方法putSerializable,利用该对象就可以传递对象了,不过传递的对象要实现Serializable接口。例如要传递一个User对象,则示例代码如下:
User类
public class User implements Serializable { //其他代码省略 }
activity中关键代码