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