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: |
||||||
|
|
||||||
|
![](https://i.loli.net/2019/02/11/5c60d51909117.png) |
||||||
|
|
||||||
|
红线代表 ACTION_DOWN 事件流向,蓝线代表 ACTION_MOVE 和 ACTION_UP 事件流向。 |
||||||
|
|
||||||
|
#### 参考 |
||||||
|
|
||||||
|
[图解 Android 事件分发机制](https://www.jianshu.com/p/e99b5e8bd67b) |
After Width: | Height: | Size: 86 KiB |
Loading…
Reference in new issue