关于编程中Context的理解

前言

在编程的过程中,经常看到别人的源码中使用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的精髓。由于水平有限,理解难免不足,还请大家多多指正。

你可能感兴趣的:(数据结构,Android)