刚编的故事
上个礼拜在小区门口打车去做头发的时候,一个去年刚转行跑外卖的同事突然把电动车骑到我跟前,其实早在去年离职前他就有跑外卖的打算,没想到这么快他的“理想”就实现了。
image想到老夫35岁也有可能面临跑外卖、摆地摊的窘境,遂决定趁这个难得的机会好好讨教讨教外卖行业的秘诀,毕竟隔行如行山嘛。
一直以来,我都错误地以为跑外卖只要勤劳点多跑点单子,收入肯定会递增,但他的一番话让我醍醐灌顶。
“你以为单子都我们自己跑出来的啊,那我挣的钱还不如以前在公司撸代码呢!”听完这句话,我开始正眼瞧他了。“有些单子比较近我就自己跑跑,要是路远或者楼层高的单子我基本上联系小弟们去跑”,说完这句话,他点着了一根烟。
image“你……你还有小弟啊?”我↓半信半疑地嘬了一口,就这样静静地看着他装B。
image“噢,就是那些比我资格稍微老点的新人嘛,其实我也是别人的小弟,我也是捡很多他们嫌弃的单子哟”。
“也就是说,单子从系统派过来的时候,资格老的人会接到很多,他们不处理的单子会给你们,你们如果再不处理就会给其他新人们,是这个意思吗?”我总结地说道。
image得到他肯定地回复以后,我又反问,“那要是这个单子实在太挫,根本没有人愿意接咋整呢?”
“那就回到第一个接单的人那里处理”,说完这句,他下意识地弹了下烟灰并略显无奈。
“那你们不想接的单子是怎么一个个转出去的啊?”
“微信啊”,说着他便给我展示微信上齐刷刷的联系人,每个人名字前面都有备注“对接人”三个字,并且还有数字,按他的意思这个数字就是优先级,比如“对接人1_王老吉”就代表不想要的单子第一个想到给王老吉,以此类推。
4b051e744a314331a5af14e1211ee477.gif“直接跟他说一声就行了,取货地址、客户地址、手机号什么的说清楚就行了,他如果不想要可以一直分下去,至于分给谁我就不管了,如果后面他没有对接人可以分的话,最后单子可能又回到我这儿来了,那我就再分给下一个对接人,要是最后我的所有对接人都不能处理这个单子,那只能我自己处理了,懂了吧”。
“等等,这个流程怎么听起来这么熟悉啊”,我们似乎都意识到了什么不对劲。
a36f0e789b6a4ddaac93b3b3d9b18e4e.gif“妈蛋,这不就是那个事件分发机制嘛”,他用夹着仅剩烟蒂的手使劲拍了大腿,咱们两人在夕阳的余晖下相视而笑。伴随着他把手机放在耳朵旁听了一段语音,便瞬间消失在了车水马龙的街道中,随后便是一道刺眼的白光让我从睡梦中惊醒过来。
image“日有所思,夜有所梦”,我只能如此安慰自己了。
躺在床上,我左思右想,这个单子究竟是如何从客户那里到达我那个同事手中呢,中间到底经历了什么?系统拿到这个单子后又是怎么找到派单人的?如果同一时间内一大坨客户下了订单,系统会怎么处理,不会丢失吗?平常没单子的时候,外卖员是处于什么状态?单子来了,又是如何让外卖员精准地拿到饭并准确无误地送到客户手中?
image带着这些问题,我陷入了婶婶地沉思……我决定反其道而行之,用安卓中事件的来龙去脉来强行解释一波(转得有点生硬)。
究竟什么是事件?
(同xio门,上阔)
96dda144ad3459822cc1cd9ef03c86a8caef8445.jpeg
度娘的意思咧,事件就是事情、事项的意思,比如一个外卖单子就是一个事项。那么对安卓来说,事件其实就是一个对象(万物皆对象嘛),这个对象至少包含这几个要素:表示位置的坐标,表示动作的类型(按下,松开,移动等)。
life-minimal-app.gif
比方说,老夫在屏幕中央按下那一刹那,可能就对应了一个坐标为“360,540”类型为“按下”的事件,如果这个事件作用到按钮上,那可能就表现出按钮按下去的状态。如果作用到返回键,那页面就返回到上一页了,等等等等,反正只要记住了,所以的事件处理就是去处理这个事件对象(感觉像一句费话)。
先别激动,你肯定要问,这个“处理”究竟是怎么一个过程呢?别急,老夫讲东西一贯秉持有条不紊地做事风格,在讲“处理”之前,有必要先说说这个到底是怎么产生的。
安卓系统的事件是如何产生的?
有人讲是Activity产生的,有人讲是窗口产生的,还有人说事件驱动产生的,然后扯出什么dispatch、WMS、inotify等让人眼花缭乱的词语。其实啊,一句话就够了,不就是用户点击屏幕产生的嘛。
是不是有种想打老朽的冲动……下面就让老朽来睡服你〜〜
1.gif咳咳,下面老朽开始讲电容屏的原理了,已经抽出40米大刀的兄弟可以在下个楼层等老夫。
为什么老夫单拎电容屏,不讲什么电阻屏、声波屏、红外线屏、电磁屏等叭啦叭啦的触摸屏呢?因为现在手机上基本上都是电容屏了,像电阻屏平常生活中也就ATM以及出租车座椅后面的显示板能看到了,手贱的朋友们下次可以一掠而过试看看,是不是没反应有木有?而红外线屏呢,据老夫查阅相关资料,电子书就属于这类货色,反正你知道除了电容屏其他几种屏幕都很难用就行了。
关于电容屏的原理,其实很简(fu)单(za),那就是人体接触屏幕后会吸走一个很小的电流,这个电流呢,会分别从屏幕四个角的电极中流出,而流出的电流量与触点到电极的距离成正比,举一个特殊的极端,如果流经四个电极的电流大小相等,那指尖肯定就点了屏幕中央了。这样,控制器就能算出触点的坐标啦。
2.gif
听懂了没?没关系,90%的物理渣渣都会听得一头雾水,其实老夫也是从百度来的,不想继续深入的同学只要知道手机里有一个叫做“控制器”的东东,它能出计算手指点击的位置在整块屏幕的坐标就行了。你要是还想钻牛角尖,可以移步老夫的另一篇文章《Android事件的前世今生:屏幕是怎么知道手指点在哪儿?》(经常过来瞅瞅,更新了此处会有超链接)
控制器计算出来的事件信息保存在哪儿了?
根据上面的介绍,一个叫“控制器”的东西计算出了事件的相关信息,比如点击位置等。那么问题来了,这个所谓的“相关信息”到底是以什么方式在哪个地方存储了呢?
我们可以设想一下,用户按下的那一刻,控制器就把“事件类型:按下,坐标;250,250”这样的字符串写入某个文件,写完的时候再让东东A通知东东B把文件内容读出来,然后这个东东B把读出来的事件往上传给应用层就行了。
看到这里,估计部分秀儿就有问题了,“老厮,你控制器直接把事件给那个东东B不就可以了嘛,干嘛还要写到文件里,再通知人家读呢?”通常遇到这种提问,老师脸上会不自然地露出强颜欢笑的微表情。
image“你干嘛做笔记?”我机智地反问了前排站起来的秀儿同学,“我想把老厮讲的话先记下来,回去再一条条消化,不然下课了就只记得住您最后一句……噢,哇咔立马西大”,秀儿不自觉地拭了下眼角悔恨的泪水。
那么,事件的相关信息是否真如老夫所讲那段字符串(肯定不是啦),是否真是保存在文件里呢(肯定是,linux一切皆文件嘛)?请容许老夫再出博客《Android事件的前世今生:事件去哪儿?》。
事件的监听
(同xio们,老厮再讲两分钟就下阔。)
timg (2).gif好了,事件也产生并保存在一个文件里,那么,接下就要解释上面那个“东东A”和“东东B”是啥啦,也要解释下前者是如何通知后者去读取那个有事件信息的文件呢?
有的同学讲,东东A是上面说的控制器,东东B是安卓系统的某个进程,这个进程有个死循环线程,就一直在读那个文件。看到这里,老夫脑海里立马浮现出几行粗暴的伪代码。
控制器:write event to file "dev/input/f0";
进程“东东B”:
new thread BT{
while(true){read event from "dev/input/f0";}
}
很明显,这是一位low逼程序员的思维方式,正确的姿势应该是线程BT读不出啥玩意儿就阻塞在那里,然后控制器如果有写入就去唤醒BT。
2053112N9-7.gif这就好比你大一的时候看上女同学,然后开辟一条叫做“谈恋爱”的线程去追人家,但是表白的时候被否了,人家撂下一句话“等我们大学毕业再谈”。钟情如你,你可以调用下面这行语句。
“谈恋爱”.睡眠(4年);
0beffe7e1f5b4b629131e9873029d318.gif不谈恋爱了,时间就可以分配到别的事儿了,比如“创业”这个线程,然后四年你发粪涂墙成为校园食堂麻辣烫巨头,毕业那天,你们的4年约期到了(专业术语:线程被唤醒),顺利牵手。
如果按照low逼的思考方式,你就等吧啥事也不干,四年即使到了人家也可以因为你矮(1.85)拒绝你,“我在佛前苦苦求了几千年”,毛用!
image绕了一大圈,老夫还是没讲上面各种“东东”是啥玩意儿,有兴趣猛戳以下文章。
《Android事件的前世今生:系统是如何监听到事件的?》
事件的分发
(今天你们体育课老师生病了)
上几节阔我们讲到,手指在触摸屏上点了一下,这个位置被控制器计算出来,计算结果又被保存到文件中,最后由系统中一个叫做“东东B”的进程把文件内容读出来了。
同xio们一定很好奇,这个东东B读出来事件干嘛呢?有的同xio已经说出来了,对,就是分发。
分发给谁呢?肯定是我们的应用层啦。
窗口为何频频收到事件?
Activity的dispatchTouchEvent何时返回true?
子view为何迟迟收不到事件?
这一切的背后!是WMS的失调还是InputDispatcher的阻塞?是parent的拦截还是children的阻挠?让我们走近博客
《Android事件的前世今生:细数事件的分发史》。
免责声明:由于那个啥,那个啥,文中相关博客待老夫抽空再慢慢消化,若因此造成理解障碍,你TM来扫我呀……
qrcode_for_gh_5a11e23db8c0_344.jpg
网友评论