Blog Archives

在4.2.2系统上ScrollView包含LinearLayout不滚动的问题

之前写过的一个APP每日美图,支持最低的API版本是7,也就是2.1以上系统都没有问题,过了一年多没有维护了,前不久用安装有最新的4.2.2系统的手机测试,发现瀑布流图墙不滚动了,这里面其实是自定义的ScrollView中OnTouchListenr捕获手指事件后分发流程的问题,早期的实现有好多方式,大致都是通过在ScrollView上实现自定义的onTouchListener,重写onTouch()方法,把事件进行捕获,但是在API17以上不知道为啥就总是失败,会被ScrollView里面的LinearLayout给屏蔽掉了。

我重新梳理了这部分流程,用实现onGestureListener的自定义ScrollView方式搞定,因为我还需要在这个里面得到手指滚动的方向,这就是曾经一度很流行的LazyScrollView的改进版,支持判断方向的版本,经我测试,在API7-17的版本上都能正常滚动和捕获事件。

下面是ScrollView代码部分,layout和Activity部分就不贴了,和大部分的实现类似。

more »

ApnsPHP完成推送后处理错误日志的正确方法

通过苹果的apns批量发送push消息,如果中间发生错误,应该需要捕获错误发生的对象,然后对那些发生错误的消息应该在后台进行标识,这是我们常见的处理逻辑,在ApnsPHP中很好的实现了这个逻辑,大致的代码如下:


//假设前面已经有了下面一句
$message->setCustomIdentifier($id); //这里的id可以是你消息对于的数据库id

...

$push->send();
$push->disconnect();

//在发送完以后,可以进行下面的处理

$aErrorQueue = $push->getErrors();
$error_ids = array();
if (!empty($aErrorQueue)) {
foreach ($aErrorQueue AS $e) {
$error_ids[] = $e['MESSAGE']->getCustomIdentifier();
}

这里面关键的一句是 $e[‘MESSAGE’]->getCustomIdentifier();

getErrors()返回的数组,每条记录也是个数组,key为MESSAGE对应的值是个ApnsPHP_Message对象,该对象可以使用getCustomIdentifier()方法取回前面通过 setCustomIdentifier($id)传入的$id值

android中获取当前activity的名称

之前看到网上和教程中通常的做法如下:


private String getRunningActivityName(){
ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
String runningActivity=activityManager.getRunningTasks(1).get(0).topActivity.getClassName();
return runningActivity;
}

这个方法不好的是需要在AndroidManifest.xml里面定义权限


事实上有更简单的方法,我一般都这么干!

private String getRunningActivityName(){
String contextString = context.toString();
return contextString.substring(contextString.lastIndexOf(“.”)+1, contextString.indexOf(“@”));

既不用定义权限,也代码简单。

发布个竞彩足球预测软件测试版本

前些日子碰巧得到个有经验的朋友指点,研究了一番竞彩足球,实战几番后,萌发了用数学的方法了尽可能的提高选择投注命中率,经过前一段的测试验证,已经有了比较满意的算法结果,这两天把android的客户单弄了个屌丝版本发布出来,欢迎对足彩有兴趣的朋友下载交流!说不定你会发现找到了新的投资理财机会,哈哈!

安装APK下载地址: http://www.toplee.com/caipiao.apk

iphone的版本过些时间也会发布一个出来,尽请期待!

Yii rules验证中可以使用的占位符列表

Here’s a list of many placeholders and the validators that are using them:

  • CBooleanValidator: {true} {false}
  • CCaptchaValidator: {id}
  • CCompareValidator: {compareAttribute} {compareValue} {operator}
  • CExistValidator: {table} {column} {value}
  • CFileValidator: {file} {limit} {extensions}
  • CNumberValidator: {min} {max}
  • CRequiredValidator: {value}
  • CStringValidator: {min} {max} {length}
  • CTypeValidator: {type}
  • CUniqueValidator: {table} {column} {value}
  • CUrlValidator: {schemes}

Of course, {attribute} is known in all validators. So, which placeholders are known depends on the validator and the condition as well: By default {min} is only used when the value is below the min value (as defined in rules) and {max} when the value is above the max value.

选择

人一辈子总在不同阶段需要面临各种选择,选择真是个不容易的事情, 总是需要权衡得失和面临放弃,从心理上要过好多关。

而今,若干年前的类似选择又摆在面前了,这次还有些许不同,这次选择能容错的空间要小很多,也就是难度系数增大了不少。

这些天事情也多,忙活着好几个项目的事情,其中最有小乐趣的项目是突然奇想产生的,得到一个朋友的实战经验启发后,夜间睡觉中突然奇想想到搞个小东西,用一套目前看来合理的数学算法预测足彩,目前算法模型已经出来了,正在进行一些数据验证,期间也不断的在调整程序算法,过些天有空弄个手机端出来试试。

足彩算法的事情,多少可以让我纠结的内心得到时不时的休息,但选择终究是需要到来的,该怎么决定呢?

国税这个衙门真不好伺候!

最近要给一个废弃多年的公司补税交罚款,还得填一百多张乱七八糟的表格,崩溃了!

想起不久前和一个税务的哥们聊天开的玩笑话。

我: 你们这些腐败的GCD啊!
哥们:都你们害的,你们能做到不让我们腐败么?
我: 汗。。。

setenforce 0

不重启机器就得时不时来这么一下,不爽,习惯了FreeBSD,突然切换到CentOS,还得磨合!

互联网创业的些许体会

看着上一篇BLOG的日子越来越远,心里不禁有一丝惶恐和不安,通常久不更新blog,都不是什么好事,要么生活没规律,人也懒惰,要么就是真的没什么可以写的,这两者都不好,尤其后者,有激情的人,每天都能从平淡中发现精彩,没什么可写,从一个侧面上反映出激情的流失,这显然不是什么好状态。

回顾一下过去这段“空白期”,发现主要还是因为懒惰而疏于更新,今天打开一个朋友的blog,连续读了几篇最近的日志,内心受到莫名的触动,朋友是个工作忙碌的人,全世界到处跑,但是多年来一直都坚持很高效率的更新日志,近期的几篇文章,大多和在柏林的新家有关,一些生活琐碎的事情,比如搬家、宜家买家具、植物园一类的,但通篇读下来却使人觉得很舒服,淡淡的真实。

受到朋友的鞭策,于是决定也奋发图强一番,在输入标题的时候,思考了良久,纠结的关键在于一个词,原本顺手写了这么个标题“互联网创业的些许感悟”,后来怎么都觉得“感悟”一词不恰当,总觉得自己离那种意境有那么点差距,弄不好会有一些误导作用,最终还是决定用“体会”代替了“感悟”, 恰到好处的感觉。

创业,很多人眼里认为那是很牛逼的,好像都是牛逼的人干的事情,其实对身临其境的人,经历创业时间久了,会时不时的从心里对创业一词感到些许的刺耳, 常常和朋友聊起去过,北漂十多年了,经历过大小公司几个,经历过创业若干年,错失过大小机会不计其数,放弃N多职业经理人的路,而今,依然还在所谓的创业路上,干脆一点,依然还在所谓的创业路上“挣扎”

大多数人认为创业是牛逼的事情,主要因为他们眼里看到的大多是那些成功的案例,尤其在互联网行业, 一个成功的创业案例会很快通过网络传播到世界各地的各个终端,进而影响到更多人进行追逐,事实上,我们99%的时间,看到的都是那1%不到的成功案例,还有另外那99.99%的失败或者正在梦想成功的道路上是看不到的,这个行业的特点非常鲜明,一个硅谷的成功神话,会带来全世界成千上万追随者,他们省吃俭用、熬夜加班、不拿工资、吃得苦中苦只为了有一天也能和那个神话一样的成功,最终的结果是99.9%的以失败告终,不管怎样,也算经历了一次创业。

08年开始,我和美国回来的朋友一起创业至今,总结起来,经历得比收获的多! 08年刚开始的时候,正是FourSquare带来的LBS风刮遍全球的时候,我们成为国内第一批LBS创业的团队,蹦心网不仅有网站, WAP站、android客户端、ios客户端,相继在我们夜以继日的工作中诞生,那个时候,我们的产品确实在行业中算是领先的,我们团队的成员时刻充满激情,不停的改进,总觉得没有完美的时候,在追求完美产品中度过了最初的两年时间,用户的增长却是非常的缓慢。

就在彷徨踌躇之际,Groupon又刮来了更猛的一场飓风,瞬间让业界和用户的目光都转移到了团购上,一夜之间,已经很少听到LBS相关的声音,好吧,团购确实来势太猛了,门槛又是如此低,不到一年时间,几千个团购网站出来了,一个个身边的神话诞生中,仿佛整个互联网的春天来到。 对于我们来讲,当时面临的抉择是困难的,有包袱的人舍不得放下,曾经为了LBS所做的那一切总是牵绊着我们前进的步伐,在面对团购的机会之际,我们举棋不定,在好多团购网站都火起来的时候,我们才下决心暂停LBS的产品改进,推出了一个介于团购导航和自己独立团购的不伦不类的产品:乐搜网,后面的结果就不用细说了。

再后来,我们在有些迷茫中,又腾出部分精力,追逐了Pinterest的步伐,尝试性的推出了一个瀑布流的图片产品每日美图(包括android客户端),结果当然也不甚满意。

回顾过去几年的经历,体会到创业途中的苦辣酸甜,总结一下,大致有这么几点。

1. 我们的团队太过偏于技术产品型,推广和运营严重不足是我们创业没有开花结果的最大障碍
2. 我们的产品设计上总是太过复杂,追求尽善尽美成为了我们发展的绊脚石
3. 推广和运营真的需要有钱才行,寻找到合适的投资人加入是创业必须的
4. 我们总是走在行业的热点中,那里真是一片红海,根据自己团队的情况,选择合适的项目进行起步非常关键
5. 在面对机会的时候,犹豫不决舍不得放弃,导致多次没有走在热点的第一波,后来者的结果基本都是悲剧
6. 爱因斯坦说,成功需要99%的汗水+1%的运气,其实那1%的运气非常重要。

前不久和一个打算从大公司出来选择创业的朋友吃牛蛙,席间谈起他一个朋友的创业经历,让我颇受触动,他那个朋友前两年弄了个网站,上面罗列了国内外各种汽车配件的价格,仅此而已,在大家都在追逐LBS、团购、瀑布流的时代,这样的东西显然很不入流,却没想这个网站挺成功,保险公司的介入给他们带来了发展的机会! 这个故事告诉我们,互联网创业追逐热门固然有一些好处,比如行业和用户都在关注,投资领域的钱也都在涌入,从成功的机会上来说,确实具备更多有利条件,而最大的不利条件是,参与竞争的对手太多,杀得红海一片, 而那些我们不太关注的领域,做精做细做深入,才是真正的蓝海。

而今,移动互联网的热潮越来越猛,在这个领域里面,貌似充满了无数的机会,今年,我们的团队度过了4个多年头的创业时光,在经历了LBS和团购两场风暴的洗礼以及Pinterest跟风之后,我们冷静了很多,也可以说有些疲惫了需要好好调整,在面对未来的选择问题上,我们变得谨慎而小心。 最近,我们一直在关注health领域,医疗健康、运动健身很明显是下阶段的热点,但是时间窗口似乎也快要关闭了,寻找到一个属于自己的小片蓝海在里面畅游,是我们接下来最需要做的事情。

关于ListView的性能,推荐一篇老外的好文章

对于纯文字内容的ListView,基本可以不看了,除非你数据量巨大,那你还是需要看。

对于有大量图片的ListView,这篇文章必须看,我之前在Android上开发应用时遇到一个ListView,每个Item里面都是若干张小图片,纠结于性能的改进很长时间,最终受益于这篇文章得以改进!

原文很长,我就不贴内容了,这里是链接地址: Performance Tips for Android’s ListView