安卓:如何在非UI线程之间进行通信并在调用者线程中处理数据?

3

问题:

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

背景:

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

例如,请求片段:

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)ID为500,则需要在线程400上调用“onFinish”。
我尝试了不同的解决方案,但没有一个符合我的要求:
1. Handlers - handler似乎是显而易见的解决方案,但必须管理和观察每个线程只调用一次Looper.prepare是棘手的。如果第三方应用程序已经为其应用程序中的调用线程定义了处理程序以满足自身目的,那该怎么办?或者,如果他从单个线程开始执行多个不同的SDK任务?这需要为每个线程开始处理Looper状态,检查它是否存在。
2. LocalBrodcastReceivers - 仅将指示返回到UI线程
3. Callback - 传递接口,在工作线程(B)上返回指示。
4. Shared Memory - 要求调用者线程(A)被阻塞,直到从工作线程(B)收到指示
5. Pipes - 要求调用者线程(A)被阻塞,直到从工作线程(B)收到指示
这种设计的目的是我无法预测第三方应用程序将在SDK回调上执行的工作量,因此我不希望它在我的线程池工作线程之一上发生。
此外,我特别谈论了两个非UI线程,因为如果其中一个是UI线程,则有许多好的解决方案可用。
你有什么想法吗?
1个回答

0

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

你可以从一个线程发布数据,并在应用程序的其他部分订阅该事件。例如代码,请查看this link


嗨,Otto 和 EventBus(Greendroid)能够将回调返回到特定线程,但据我所知,它们支持所有线程,但不支持返回到调用者线程。Otto(MAIN、ANY)GreenDroid(POST、MAIN、BACKGROUND、ASYNC),我需要调用者或订阅者。 - senior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接