parent
							
								
									a95a01fa94
								
							
						
					
					
						commit
						b670776788
					
				| @ -1,8 +0,0 @@ | ||||
| --- | ||||
| Serializable 与 Pracelable | ||||
| --- | ||||
| 
 | ||||
| #### 目录 | ||||
| 
 | ||||
| 1. 思维导图 | ||||
| 2.  | ||||
| @ -0,0 +1,85 @@ | ||||
| --- | ||||
| Serializable 与 Parcelable | ||||
| --- | ||||
| 
 | ||||
| #### 目录 | ||||
| 
 | ||||
| 1. 概述 | ||||
| 2. 具体使用 | ||||
| 3. 区别对比 | ||||
| 4. 参考 | ||||
| 
 | ||||
| #### 概述 | ||||
| 
 | ||||
| Serializable 和 Parcelable 是用来序列化和反序列化的,其中 Serializable 是 Java 提供的一个序列化接口,它是一个空接口,专门为对象提供标准的序列化和反序列化操作,使用起来比较简单。而 Parcelable 则稍显复杂,实现该接口重写两个模版方法,并且需要提供一个 Creator。 | ||||
| 
 | ||||
| #### 具体使用 | ||||
| 
 | ||||
| ##### Serializable | ||||
| 
 | ||||
| ```java | ||||
| public class User implements Serializable { | ||||
| 
 | ||||
|     private static final long serialVersionUID = -541329592684050557L; | ||||
| 
 | ||||
|     public String name; | ||||
|     public int age; | ||||
|      | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ##### Parcalable | ||||
| 
 | ||||
| ```java | ||||
| public class User implements Parcelable { | ||||
| 
 | ||||
|     public static final Creator<User> CREATOR = new Creator<User>() { | ||||
|         @Override | ||||
|         public User createFromParcel(Parcel source) { | ||||
|             return new User(source); | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public User[] newArray(int size) { | ||||
|             return new User[size]; | ||||
|         } | ||||
|     }; | ||||
|     public String name; | ||||
|     public int age; | ||||
| 
 | ||||
|     public User(String name, int age) { | ||||
|         this.name = name; | ||||
|         this.age = age; | ||||
|     } | ||||
| 
 | ||||
|     protected User(Parcel in) { | ||||
|         this.name = in.readString(); | ||||
|         this.age = in.readInt(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int describeContents() { | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void writeToParcel(Parcel dest, int flags) { | ||||
|         dest.writeString(this.name); | ||||
|         dest.writeInt(this.age); | ||||
|     } | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| #### 区别对比 | ||||
| 
 | ||||
| ##### 实现差异 | ||||
| 
 | ||||
| Serializable 的实现,只需要实现一个 Serializable 接口即可,这只是给对象打了一个标记,系统会自动将其序列化;而 Parcelable 的实现,不仅需要实现 Parcelable 接口并重写模版方法,还要提供一个 CREATOR,并实现 Parcelable.Creator 接口,并实现读写的抽象方法。 | ||||
| 
 | ||||
| ##### 效率对比 | ||||
| 
 | ||||
| Serializable 使用 I/O 读写存储在硬盘上,序列化过程中产生大量的临时变量,会引起频繁 GC,效率低下。而 Parcelable 是直接在内存中读写,更加高效。 | ||||
| 
 | ||||
| #### 参考 | ||||
| 
 | ||||
| [序列化与反序列化之 Parcelable 和 Serializable 浅析](https://juejin.im/entry/57e8d42e816dfa005ef310be) | ||||
| @ -0,0 +1,62 @@ | ||||
| --- | ||||
| 事件分发机制 | ||||
| --- | ||||
| 
 | ||||
| #### 目录 | ||||
| 
 | ||||
| 1. 概述 | ||||
| 2. 核心方法 | ||||
| 3. 关于 ACTION_MOVE 和 ACTION_UP | ||||
| 4. 参考 | ||||
| 
 | ||||
| #### 概述 | ||||
| 
 | ||||
| 事件分发中的事件即指 MotionEvent,传递方向是 Activity -> ViewGroup -> View,然后在回溯。事件分发包含三个核心方法:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。 | ||||
| 
 | ||||
| #### 核心方法 | ||||
| 
 | ||||
| ##### dispatchTouchEvent | ||||
| 
 | ||||
| 用于事件分发,返回结果表示是否消耗了当前事件。它和 onInterceptTouchEvent 和 onTouchEvent 的关系可以表示为: | ||||
| 
 | ||||
| ```java | ||||
| public boolean dispatchTouchEvent(MotionEvent ev){ | ||||
|     boolean consume = false; | ||||
|     if(onInterceptTouchEvent(ev)){ | ||||
|         consume = onTouchEvent(ev); | ||||
|     }else{ | ||||
|         consume = child.dispatchTouchEvent(ev); | ||||
|     } | ||||
|     return consume; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ##### onInterceptTouchEvent | ||||
| 
 | ||||
| 只存在于 ViewGroup 中,只有 ViewGroup 才会决定是否需要拦截事件自己处理。默认是不会拦截的,交给子 View 处理。 | ||||
| 
 | ||||
| ##### onTouchEvent | ||||
| 
 | ||||
| 用于事件处理,我们平时设置的 onTouchEventListener 和 onClickListener 都是在其内。 | ||||
| 
 | ||||
| ##### 总结 | ||||
| 
 | ||||
| 1. 对于 dispatchTouchEvent 和 onTouchEvent ,return true 代表终止时间传递,return false 则是回溯到父 View 的 onTouchEvent 方法。 | ||||
| 2. ViewGroup 想把事件分发给自己的 onTouchEvent,需要 onInterceptTouchEvent return true 把事件拦截下来,默认是不拦截的,所以 return super.onInterceptTouchEvent == return false 到 View.dispatchTouchEvent。 | ||||
| 3. View 没有拦截器,为了让 View 可以把事件分发给自己的 onTouchEvent,View 的 dispatchTouchEvent 默认实现(super)就是把事件分发给自己的 onTouchEvent。 | ||||
| 
 | ||||
| #### 关于 ACTION_MOVE 和 ACTION_UP | ||||
| 
 | ||||
| 上面都是针对 ACTION_DOWN 的时间传递,ACTION_MOVE 和 ACTION_UP 在传递的过程中并不是和 ACTION_DOWN 一样。如果在执行 ACTION_DOWN 的时候返回了 false,后面一系列其他的 action 就不会再得到执行了。简单来说,就是当 dispatchTouchEvent 在进行事件分发的时候,只有前一个事件(如 ACTION_DOWN)返回 true,才会收到 ACTION_MOVE 和 ACTION_UP 的事件。 | ||||
| 
 | ||||
| ACTION_DOWN 一旦在 onTouchEvent 被消费,那么之后的 ACTION_MOVE 和 ACTION_UP 就都会由其处理,结束时间传递。 | ||||
| 
 | ||||
| 比如我们在 Activity 的 onTouchEvent 返回 true: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| 红线代表 ACTION_DOWN 事件流向,蓝线代表 ACTION_MOVE 和 ACTION_UP 事件流向。 | ||||
| 
 | ||||
| #### 参考 | ||||
| 
 | ||||
| [图解 Android 事件分发机制](https://www.jianshu.com/p/e99b5e8bd67b) | ||||
| After Width: | Height: | Size: 86 KiB | 
					Loading…
					
					
				
		Reference in new issue