前言
在编程的过程中,经常看到别人的源码中使用Context。经过一段时间的实践,谈谈个人对其的理解。
正文
是什么
- Context 指做一件事情的背景/环境/上下文/所需要的必要的数据
- AppContext 应用上下文,包含整个App运行期间必要的数据
- UserContext 用户上下文,包含一个User的上下文数据
一个经典的Context例子:
- 在一个操作系统中,包含多个进程,每个进程包含多个线程
- 每个进程和线程都有自身运行的上下文数据,以便和其他进程和线程区分
OperatingSystem
Process #0
Thread #0
Thread #1
...
Process #1
Thread #0
Thread #1
...
Process #2
Thread #0
Thread #1
...
...
我们拿Android中ThreadLocal模块来举例说明一下。
- 我们把背景限制在上面的Process #0 空间(上下文)
- Thread #0和Thread #1 是不同的线程空间(上下文)
- 我们利用ThreadLocal在Thread #0下面写入一份数据,比如Looper
- 一般情况下在Thread #1空间里面读取不到Thread #0空间下ThreadLocal类型的数据
使用方法
- 每个Context对象只包含自身的数据
- 多个Context对象就对应不同的数据
- 很容易做到数据隔离,避免结构混乱
举个例子,我们使用手Q/微信的时候都会登录自己的账号,并且和不同的好友进行聊天。对于该场景可以这么设计数据结构:
AccountContext[]
Account
SessionContext[]
Session
- 首先,第一层是账号上下文,每个账号都有自己的数据,如名称、头像等,在切换账号时需要把区分旧的AccountContext和新的AccountContext
- 其次,第二层是会话上下文,同时和多个不同的好友聊天,每个聊天的上下文数据隔离
- 最后,第三层的会话实体,包含会话ID之类的数据
关键是需要把数据合理的拆分到不同的模块底下,这样数据结构就会比较清晰易懂。
总结
本文描述了个人对Context的一些理解以及使用方法,后续还需要多在实际中进行运用才能更好的理解Context的精髓。由于水平有限,理解难免不足,还请大家多多指正。