跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 安卓主进程等待多个子进程做完任务有什么优雅的设计模式吗?
未分類
10 11 月 2020

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

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

資深大佬 : kerb15 2

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

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

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

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

大佬有話說 (30)

  • 資深大佬 : luckyrayyy

    这…操作系统和 api 层面都有现成的,你搞些奇技淫巧干啥

  • 主 資深大佬 : kerb15

    @luckyrayyy 啊,能举个例子吗

  • 資深大佬 : carlclone

    信号。。。

  • 資深大佬 : acmore

    [CountDownLatch]( https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)

  • 資深大佬 : Resource

    安卓可以用 CompletableFuture 吗?

  • 資深大佬 : jobsofchina

    不懂就问,安卓没有 join()吗

  • 資深大佬 : liian2019

    CompletionService

  • 資深大佬 : winterbells

    https://www.kotlincn.net/docs/reference/coroutines/composing-suspending-functions.html

  • 資深大佬 : 0xZhangKe

    RxJava

  • 資深大佬 : tanranran

    坐等大佬回复,上的说实话,都是不看题目的,LZ 说的是进程,不是线程

  • 主 資深大佬 : kerb15

    @acmore 可以用于进程吗

  • 主 資深大佬 : kerb15

    @tanranran 哈哈,终于有个看明白的

  • 資深大佬 : gam2046

    自己利用 Binder 实现类似 ForkJoinPool 的机制或者共享内存( CPP )是比较低成本的方式。但如果不是因为 OOM,这样的工作,不建议使用多进程这样重量级的方式。

  • 資深大佬 : knowckx

    sync.waitgroup 的味道

  • 資深大佬 : mingl0280

    https://stackoverflow.com/questions/24392132/how-to-wait-for-a-background-process-to-finish-in-android

  • 資深大佬 : hm279

    正常人有开三个进程去写一个文件吗?线程吧

  • 資深大佬 : hongch

    一个 APP 只有一个进程啊,难道是开了多个 service 去写同一个文件?
    又或者是开了多个线程去写同一个文件?

  • 資深大佬 : tanranran

    @hongch #17 安卓是可以多个进程的

  • 資深大佬 : hdfg159

    RxJava 做任务编排

  • 資深大佬 : acmore

    @kerb15
    @tanranran

    每个进程都用一个线程监控,Process 等待结束之后用 CountDownLatch 通知主进程的主线程。这种方法可以做到 “实时” 监控所有进程的情况。也可以用其他的工具,但我觉得 CountDownLatch 是最直接且直观的。

  • 資深大佬 : ysy950803

    个人认为这个还是很难避免 3 次跨进程通信,说白了还是需要某种计数的。要说最优雅,我觉得 ContentProvider 就能实现,主进程 observe 进行计数,其他进程任务完成后分别写标识。
    此外,也可以利用类似 Handler 这种有消息队列的机制,但是原生 Handler 不是用来跨进程的,不过有人用 Binder 机制实现了跨进程的 Handler,可以谷歌一下。不过利用跨进程 Handler 的话,一样地需要在主进程计数,也避免不了 3 次跨进程通信。
    我能想到的减少进程间通信次数办法,可能还是预估延时机制,你这里是写文件,如果可以提前知道写数据的大小,就能预测一个所有任务都完成的大概时间,到时候就不需要跨进程通信了,主进程在 timeout 之后直接去处理生成的文件,如果发现少了 1 个,就说明还有子进程没完成任务,这时候再降级成跨进程监听吧。这种办法对于及时性要求不高的场景我觉得还是可以的,想法可能不成熟。

  • 資深大佬 : ysy950803

    啊为什么 V 站还不支持编辑,我再补充一下吧。其实利用 ContentProvider 配合数据库就挺好,也是最快的实现方式。如果还使用 Room+LiveData 的话,更方便。

  • 資深大佬 : myCupOfTea

    rxjava?

  • 資深大佬 : zpxshl

    别做这种无聊的事,到线上就会发现,处理边缘 case 比核心代码还多。 子进程挂了咋办?

  • 資深大佬 : okaku

    子进程蛮独特的,还没接触过需要用进程去提高运算速度的案子

  • 資深大佬 : behanga

    FileObserver 了解一下

  • 資深大佬 : StrorageBox

    上回复的都什么啊。。。。 你这个情况直接 messager 去做通知,android 里最轻量级的进程间通信了。

  • 資深大佬 : cxxxxx

    kotlin coroutines async

  • 資深大佬 : b1iy

  • 資深大佬 : RikkaW

    如果 ABC 是 Android 世界的进程用 Binder 是最好的

    但是不管怎么样,主进程里做计数是跑不掉的(

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具