小木箱@Singapore

Results 63 comments of 小木箱@Singapore

## View 的事件分发机制    什么是事件分发? 事件分发,通俗点就是处理`点击事件`的流程。`MotionEvent`就是我们要分析的点击事件对象,即当一个`MotionEvent`产生以后,系统需要把这个事件传递个具体的`View`。 ### 一. 点击事件的传递规则 - `分发:dispatchTouchEvent` - 如果事件传递给当前`View` - 一定会被调用。 - `拦截:onInterceptTouchEvent` - 如果当前 `View` 拦截了某个事件 - **同一事件**中这个方法**不会**被再次调用。 - `消费:onTouchEvent` - 如果不消耗,则在同一个事件序列中 - `View`无法再次收到事件。 ```java...

事件分发机制其实整体来说涉及但`View`的触摸反馈还是比较简单的,只要注意一点,重写`onTouchEvent`,然后明白它的核心思想就是: 是否为消费事件取决于 `ACTION_DOWN` 事件是否返回为true,那么我们如何获取`MotionEvent`呢,这里要讲的有两个`API`,第一个是 `getActionMasked` ,而另外一个是 `getAction`,如果你不知道用哪个,用`getActionMasked` 就ok了。 那么`ACTION_DOWN` 事件具体干了一件什么事情呢?如果在滑动事件中,切换至按压状态,并注册按下计时器。当按下进入按压状态并移动`ACTION_MOVE`,重绘`Ripple Effect`,然后`ACTION_MOVE`是设计控件移动的反馈事件,而`ACTION_CANCLE`是切换抬起状态,并清除一切状态

`ViewGroup`事件分发体系稍微有点复杂,相比单`view`的事件体系而言,,除了重写`onTouchEvent`以外,还重写了`onInterceptTouchEvent`,`onInterceptTouchEvent`不用在第一时间返回true,只有当事件被拦截的时候返回true就行了。那么从源码层次怎么去理解`ViewGroup`的时间分发体系呢?说白点,其实自定义view我们知道,关于viewGroup的子view都是按层级遍历解析的,那么同理,viewGroup的触摸反馈流程也是由Activity.dispatchTouchEvent 触发,然后历经 window,再到view层次,具体怎么做呢,我简单说一下: 递归Activty的dispatchTouchEvent,然后在通过调用viewGroup的dispatchTouchEvent,然后去观察ViewGroup的onInterceptTouchEvent,然后层层遍历最终child dispatchTouchEvent 和 view的onTouchEvent,最后所有子view的时间体系走完之后就走Activity的onTouchEvent

## 第一步: 在SDK/tool 安装目录找到 ![image](https://user-images.githubusercontent.com/17723631/100299164-f29b5780-2fcd-11eb-8c0f-608ebc79556a.png)

## AsyncTask ### 一.概念    `AsyncTask` 是一种轻量级的异步任务类,它可以在任务线程中执行后台任务,然后把执行的进度传递给主线程并在主线程中更新UI ### 二.组成 #### a.组织架构    `AsyncTask` = `Handler` + `ThreadPoolExecutor` #### b.参数 ```java abstract class AsyncTask ``` - 泛型类,提供 `Params`,`Progress`和 `Result`三个泛型参数. - `Params:`...

懒加载的目的是在Fragment对我们可见时,我们才进行网络加载,然后再解析数据,更新UI,从而减少流量浪费,耗时请求。可见时候,`setUserVisibleHint `设置为true,否则为false,在可见状态的时候进行网络请求。但是这里有一个bug,就是数据秒回的时候,ui还没来得及绑定,或者adapter没有及时初始化,那么我们就无法及时更新`ui`呢,所以我们在数据填充时候,需要通过`getUserVisibleHint `判断数据是否需要拉取

AspectJ 支持动态织入,原理是静态代理,如Spring的实现 2. Cglib、JDK 动态代理属于动态织入,原理是动态代理 3. 而 ASM 只是一个字节码操作的工具,静态还是动态就看你在哪个阶段利用它。

- lint进行代码扫描,清除未被引用的资源文件 - 代码混淆 - so动态加载 - 统一网络库 - 非高清大图使用`jpg`替代`png` - 音频文件网络下载,不要存放assert目录下 - 去除不必要的调试日志信息和排查问题日志 - Liabary压缩,合并和裁剪

### 在使用ClassLoder进行类加载过程,有没有哪些地方违背了双亲委派模型?    在本地类加载的方式一般我们是这么使用的: ```java // 正在使用的类加载器:AppClassLoader ClassLoader c = MicroKibaco.class.getClassLoader(); // AppClassLoader 的父加载器 PlatformClassLoader ClassLoader c1 = c.getParent(); // PlatformClassLoader 的父加载器是BootStrap.它是c++实现的,返回null ClassLoader c2 = c1.getParent(); ``` 最高一层`BootStrap`是通过 `c++` 实现的,并不存在`JVM`体系内,所以输出为null,类加载具有等级制度,但是并非继承关系,以组合方式复用父加载器的功能,这也符合组合有限原则。  但是双亲委派模型并不是强制必须的,对于自己加载不了的类怎么办?直接用线程上下文类加载器完成,通过:...

![image](https://user-images.githubusercontent.com/17723631/99195216-62843380-27bf-11eb-9bd3-780c398ac525.png) 这个时候 B 覆盖了窗体, A 会调用 onStop() 方法. 如果 B 是个透明的,或者 是对话框的样式, 就不会调用 A 的 onStop() 方法。