Android 进阶之光笔记

该笔记记录了关键原理的一些要点,并非源码分析。分析请看《Android进阶之光》

1 View 的事件分发机制–TouchEvent从顶层传递到底层:
顶层指的是ViewGroup(LinearLayout之类,可理解为contentView),底层指的是各种需要点击的控件(button,textview之类)。
ViewGroup找到子view–child数组,进行遍历
viewGroup中的child数组-数组中元素是同层的,高标号的是最子层(视觉上,布局文件上顺序)的view。

ViewGroup没有重写onTouchEvent();
view定义了onTouchEvent();但viewGroup会调用super.onTouchEvent();《===发生在重写了onInterceptTouchEvent 返回true的情况下。
Activity,ViewGroup,View均使用dispatchTouchEvent方法把touch事件向下传递;
onTouchListener 的onTouch 是在dispatchTouchEvent中调用的 在onTouchEvent之前,
onClick回调是在 onTouchEvent中进行的,而onTouchEvent是在dispatchTouchEvent被中调用的。

2 AsyncTask实现原理:
7.0以后的Api:

两个线程池,一个Handler实现。

AsyncTask创建时会创建一个WorkerRunnable对象,管他叫worker。其中的run方法会回调我们定义的doInBackground();
以及把结果进行post的操作。

进一步会把这个worker包装到一个FuterTask中,管他叫task;
当调用AsyncTask的execute()方法时,会调用本身的一个默认线程池(sDefaultExecutor)管他叫池1,池1有一个execute(task)方法,

这时会把task作为参数传给池1进行execute;执行前会回调onPreExecute()方法,并把AsyncTask执行参数传递给task的worker。
池1进行execute实际是把task放入池1的任务队列中。
这个线程池自动会取出里面的任务并交给实际线程池(THREAD_POOL_EXECUTOR),管他叫池2。

池2会缓存池1提交的task并按顺序执行。因为task包括了doInBackground和post操作,当池2执行每个任务时
执行结果就会post给AsyncTask内部的Handler。handlerMessage()方法会取出结果,调用
AsyncTask的finish()方法,finish()接收result参数。

finish方法会回调onPostExecute(),主线程得到了执行结果。

猜你喜欢

转载自blog.csdn.net/thezprogram/article/details/80936908