安卓主进程等待多个子进程做完任务有什么优雅的设计模式吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
/div>
现在注册
已注册用户请  登录
31 条回复    2020-12-04 18:08:51 +08:00
luckyrayyy
    1
luckyrayyy  
   2020 年 11 月 19 日
这...操作系统和 api 层面都有现成的,你搞些奇技淫巧干啥
ex1gtnim7d
    2
ex1gtnim7d  
OP
   2020 年 11 月 19 日
@luckyrayyy 啊,能举个例子吗
carlclone
    3
carlclone  
   2020 年 11 月 19 日
信号。。。
acmore
    4
acmore  
   2020 年 11 月 19 日
Resource
    5
Resource  
   2020 年 11 月 19 日
安卓可以用 CompletableFuture 吗?
jobsofchina
    6
jobsofchina  
   2020 年 11 月 19 日 via Android
不懂就问,安卓没有 join()吗
liian2019
    7
liian019  
   2020 年 11 月 19 日
CompletionService
0xZhangKe
    9
0xZhangKe  
   2020 年 11 月 19 日
RxJava
ByteRan
    10
ByteRan  
   2020 年 11 月 19 日   3
坐等大佬回复,楼上的说实话,都是不看题目的,LZ 说的是进程,不是线程
ex1gtnim7d
    11
ex1gtnim7d  
OP
   2020 年 11 月 19 日
@acmore 可以用于进程吗
ex1gtnim7d
    12
ex1gtnim7d  
OP
   2020 年 11 月 19 日
@tanranran 哈哈,终于有个看明白的
ntdll
    13
ntdll  
   2020 年 11 月 19 日
自己利用 Binder 实现类似 ForkJoinPool 的机制或者共享内存( CPP )是比较低成本的方式。但如果不是因为 OOM,这样的工作,不建议使用多进程这样重量级的方式。
knowckx
    14
knowckx  
   2020 年 11 月 19 日
sync.waitgroup 的味道
hm279
    16
hm279  
   2020 年 11 月 19 日 via Android
正常人有开三个进程去写一个文件吗?线程吧
hongch
    17
hongch  
   2020 年 11 月 19 日
一个 APP 只有一个进程啊,难道是开了多个 service 去写同一个文件?
又或者是开了多个线程去写同一个文件?
ByteRan
    18
ByteRan  
   2020 年 11 月 19 日
@hongch #17 安卓是可以多个进程的
hdfg159
    19
hdfg159  
   2020 年 11 月 19 日 via Android
RxJava 做任务编排
acmore
    20
acmore  
   2020 年 11 月 19 日
@kerb15
@tanranran

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

我感觉题主有点小题大作。
RikkaW
    30
RikkaW  
   2020 年 11 月 21 日
如果 ABC 是 Android 世界的进程用 Binder 是最好的

但是不管怎么样,主进程里做计数是跑不掉的(
xierbenq
    31
xierbenq  
   2020 年 12 月 4 日
建立一个文件夹,子进程做任务时就创建一个文件,做完删掉,主进程监控这个文件夹,不过考虑到子进程各种意外情况死掉,linux flock 也许更合适。
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5291 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 89ms UTC 08:56 PVG 16:56 LAX 01:56 JFK 04:56
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86