安卓主进程等待多个子进程做完任务有什么优雅的设计模式吗?

2020-11-19 17:36:58 +08:00
 kerb15

一个 App 中运行了 4 个进程,包括主进程和 ABC 三个子进程。

主进程通知 ABC 同时去做一件写文件的任务,当 ABC 都做完时再回来告诉主进程,主进程对生成的文件进行压缩。

现在想到的笨方法无非就是一个变量去记录 ABC 是否已经完成,比如 000 表示都没完成,111 表示都完成了。

有没有老哥做过类似的案例,有什么奇思妙想吗?

10486 次点击
所在节点    Android
31 条回复
ysy950803
2020-11-20 00:20:53 +08:00
个人认为这个还是很难避免 3 次跨进程通信,说白了还是需要某种计数的。要说最优雅,我觉得 ContentProvider 就能实现,主进程 observe 进行计数,其他进程任务完成后分别写标识。
此外,也可以利用类似 Handler 这种有消息队列的机制,但是原生 Handler 不是用来跨进程的,不过有人用 Binder 机制实现了跨进程的 Handler,可以谷歌一下。不过利用跨进程 Handler 的话,一样地需要在主进程计数,也避免不了 3 次跨进程通信。
我能想到的减少进程间通信次数办法,可能还是预估延时机制,你这里是写文件,如果可以提前知道写数据的大小,就能预测一个所有任务都完成的大概时间,到时候就不需要跨进程通信了,主进程在 timeout 之后直接去处理生成的文件,如果发现少了 1 个,就说明还有子进程没完成任务,这时候再降级成跨进程监听吧。这种办法对于及时性要求不高的场景我觉得还是可以的,想法可能不成熟。
ysy950803
2020-11-20 00:25:20 +08:00
啊为什么 V 站还不支持编辑,我再补充一下吧。其实利用 ContentProvider 配合数据库就挺好,也是最快的实现方式。如果还使用 Room+LiveData 的话,更方便。
myCupOfTea
2020-11-20 09:16:13 +08:00
rxjava?
zpxshl
2020-11-20 09:39:20 +08:00
别做这种无聊的事,到线上就会发现,处理边缘 case 比核心代码还多。 子进程挂了咋办?
okaku
2020-11-20 10:50:01 +08:00
子进程蛮独特的,还没接触过需要用进程去提高运算速度的案子
behanga
2020-11-20 10:51:08 +08:00
FileObserver 了解一下
StrorageBox
2020-11-20 11:08:35 +08:00
楼上回复的都什么啊。。。。 你这个情况直接 messager 去做通知,android 里最轻量级的进程间通信了。
cxxxxx
2020-11-20 15:03:57 +08:00
kotlin coroutines async
b1iy
2020-11-20 16:13:40 +08:00
📢广播.

我感觉题主有点小题大作。
RikkaW
2020-11-21 15:34:46 +08:00
如果 ABC 是 Android 世界的进程用 Binder 是最好的

但是不管怎么样,主进程里做计数是跑不掉的(
xierbenq
2020-12-04 18:08:51 +08:00
建立一个文件夹,子进程做任务时就创建一个文件,做完删掉,主进程监控这个文件夹,不过考虑到子进程各种意外情况死掉,linux flock 也许更合适。

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

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

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

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

© 2021 V2EX