真香警告:就算不封装商业级 SDK,也请务必掌握的 Android 状态管理最佳实践!

2019-07-03 13:29:51 +08:00
 KunMinX

很高兴见到你!

上上周我在掘金碰巧遇到了一篇用设计模式管理状态的文章,一时兴奋不已,在评论区安利了,一直以来我司在封装商业级 SDK 时,使用的十六进制状态管理机制。

原以为会无人对此感兴趣,没想到,留言很快就收到文章作者的回复,并且在评论区耐心地和我探讨了设计模式的 独占式状态机,和十六进制的 复合状态管理 在使用场景上的区别。

遗憾的是,通过评论区的只言片语,并不能让人体会到 十六进制状态管理 的真正魅力。

于是作为回馈,我特地分享了这一篇:当我们封装商业级 SDK 时,我们是怎么使用十六进制来完成状态管理。

😉

此外,是只有封装 SDK 这种大动作,才值得使用十六进制吗?不是的,恰恰相反,正因为 十六进制状态管理是如此地普适,乃至于连封装 SDK 都优先使用这种方式。

考虑到部分读者可能对十六进制本身不太了解,本文会连同十六进制一起介绍。

所以如果阅读完这篇文章,你对 十六进制的状态管理 有了感性的认识,那我的愿望也就达到了。

https://juejin.im/post/5d1a148e6fb9a07ea6488ba3

12453 次点击
所在节点    Android
38 条回复
also24
2019-07-03 13:53:40 +08:00
你这明明是二进制状态管理,关十六进制什么事情……

写成十六进制还不方便理解,要思考一下:
private final int STATUS_1 = 0x0001;
private final int STATUS_2 = 0x0002;
private final int STATUS_3 = 0x0004;
private final int STATUS_4 = 0x0008;


直接移位多方便:
private final int STATUS_1 = 1 << 0;
private final int STATUS_2 = 1 << 1;
private final int STATUS_3 = 1 << 2;
private final int STATUS_4 = 1 << 3;


或者干错手动补 0 也方便理解啊:
private final int STATUS_1 = 0b1;
private final int STATUS_2 = 0b10;
private final int STATUS_3 = 0b100;
private final int STATUS_4 = 0b1000;
whileFalse
2019-07-03 13:55:48 +08:00
各位不用点进去了,就是把多个 bool 放到一个 int 里面。洋洋洒洒写了四千字。
busymilk
2019-07-03 13:59:12 +08:00
不是 flag 那一套么。。。
WebKit
2019-07-03 14:02:35 +08:00
这种文章写这么详细,应该比较适合刚入门什么都不会的。
KunMinX
2019-07-03 14:04:10 +08:00
@also24 @whileFalse @WebKit

那你很棒哦
AndroidEngineer
2019-07-03 14:24:15 +08:00
来点高端的,比如 dex 热修,so 混淆加密,现在 Android 不往底层走等于菜鸡
ShangShanXiaShan
2019-07-03 14:32:34 +08:00
@AndroidEngineer "你很棒"警告
Lucups
2019-07-03 14:53:06 +08:00
感叹号结尾的文章标题一律不看
ys1992
2019-07-03 14:57:23 +08:00
楼主分享思路不错,赞一个!一楼优化解释也很好,确实更通用且便于理解吧,本质都是通过位运算来解决多状态集合问题
ostholz
2019-07-03 15:05:09 +08:00
@also24 节约我时间, 没点进去。
agostop
2019-07-03 15:08:05 +08:00
之前在一个接口上用过类似的算法,和题主描述的场景差不多,不过是用的二进制……没看懂为什么非要用 16 进制?
ice000
2019-07-03 15:11:07 +08:00
标题党
zjiecode
2019-07-03 15:13:44 +08:00
感谢楼主,虽然很基础,但是还是很不错的,另外,权限之类的,也可以考虑这种思想。
不过,要是状态超过了 32,就用 long,那超过 64 了呢?有没有啥好的解法呢?
KunMinX
2019-07-03 15:23:40 +08:00
@Lucups @ostholz @ice000

那你很棒哦

@ys1992 @mrjiejiejie

感谢你的阅读!

我司目前封装的 SDK,一个功能的状态一般不超过 12 个,所以就算 int 也足够。

64 个状态的话,到底是什么功能才会存在这样的设计呢?
SuperNovaSonic
2019-07-03 15:24:35 +08:00
来自掘金:
SuperNovaSonic
2019-07-03 15:24:44 +08:00
金 1998
你应该没怎么玩过 C 语言
21 分钟前
KunMinXlv-3(作者)
Android @ ViaBus-Architecture
回复 金 1998: 那你很棒哦
4 分钟前
KunMinX
2019-07-03 15:40:25 +08:00
@SuperNovaSonic

有什么依据呢?
yusuzhan
2019-07-03 15:55:20 +08:00
这个东西在 Java 里很常用,叫做位掩码。
alextang95
2019-07-03 16:02:52 +08:00
@KunMinX 这种状态处理属于基本操作。
C 语言用的更多,因为要用那么一点点内存作更多的事。
另外这和十六进制没什么关系,就是二进制状态。
状态的转移用位运算。

@also24 @whileFalse 二位省了大家好多时间,感谢
lastpass
2019-07-03 16:06:07 +08:00
楼主快坐下,快坐下。
不过一些常规操作而已。
快翻开你大学时候的计算机导论,
c 语言基础,
汇编基础的书的前两章温习一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579615

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX