【问题标题】:Android: How to communicate between non-ui threads and processes the data on the caller thread?Android:如何在非ui线程之间进行通信并在调用者线程上处理数据?
【发布时间】:2014-12-04 07:33:46
【问题描述】:

问题:

我需要将指示\对象从线程 A 传递给线程 B,并且该指示需要在线程 A 上异步处理(不阻塞)。

背景:

我设计了一个SDK(线程B),它基本上通过ThreadPoolExecutor机制运行一些任务。 第 3 方应用(线程 A),使用 SDK 请求运行任务和实现。结果的回调,任务可以并行操作并异步返回结果。

即一个请求sn-p:

SDK.taskA(new CustomCallback() {
    @Override
    public void onFinish(String s) {
         // run some code - let's refer to as **Section A**
    }
});

即 SDK 返回一个回调:

mCustomCallback.onFinish(String s);

问题在于回调 - “onFinish”是在工作线程 - SDK(显然)而不是在调用者线程上处理的。即如果调用者线程 (A) id 为 400,工作者 (B) 为 500,我需要在线程 400 上调用“onFinish”。

我尝试了不同的解决方案,但没有一个符合我的要求:

  1. Handlers - 处理程序似乎是显而易见的解决方案,但必须管理和观察 Looper.prepare 每个线程只会被调用一次是很棘手的,如果第 3 方应用程序已经为调用线程定义了一个处理程序怎么办?他的应用程序是为了他自己的目的吗?或者如果他从单个线程启动许多不同的 SDK 任务怎么办?这需要开始处理每个线程的 Looper 状态,检查它是否存在。

  2. LocalBrodcastReceivers - 仅向 UI 线程返回指示

  3. 回调 - 传递接口,在工作线程 (B) 上返回指示。

  4. 共享内存 - 要求调用者线程 (A) 被阻塞,直到收到来自工作线程 (B) 的指示

    • 管道 - 要求调用者线程 (A) 被阻塞,直到收到来自工作线程 (B) 的指示

此设计背后的目的是我无法预测 3rd 方应用程序将在 SDK 回调中执行的工作量,因此我不希望它发生在我的一个线程池工作人员身上。

此外,我特别谈论 2 个非 ui 线程,因为其中之一是 ui 线程,那里有很多好的解决方案。

有什么想法吗?

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    您可以尝试使用otto,它是一种事件总线,旨在解耦应用程序的不同部分,同时仍允许它们有效通信。

    您可以从一个线程发布您的数据,也可以在应用程序的其他部分订阅该事件。例如代码签出this link

    【讨论】:

    • 嗨,Otto 和 EventBus (greendroid) 能够将您的回调返回到特定线程,但据我所知,它们支持除了返回调用者线程之外的所有内容。 Otto (MAIN,ANY) GreenDroid(POST,MAIN,BACKGROUND,ASYNC) 我需要调用者或订阅者
    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    相关资源
    最近更新 更多