管理远程服务回调

时间:2016-03-01 21:42:23

标签: java android service callback aidl

我有一种情况,我觉得我要重新发明轮子或绕过房子,处理已经有“设计”的事情。因为 - 在我做之前,我希望我能得到第二个意见。

我有一个远程服务。由于应用程序本身具有不寻常的特性/功能,它是一个永久性的前台服务。

我正在编写一个库,以便第三方应用程序可以绑定到该服务并使用我公开的API。由于我自己处理线程并且大多数回调都是异步的,我使用的是AIDL方法,其中包含了自定义类的“自我调整”功能。为服务提供必要的参数。到目前为止,一切都很完美。

我的服务代码的构造与RemoteService API example非常相似,所以我会参考,因为发布我的特定代码不会改变问题。

作为with the example,我将每个请求的接口保存到RemoteCallbackList,这似乎是其他一些基本原理的便捷解决方案。

但是,我的服务并未向一组等待的接收者提供相同的信息。正如使用以下代码段所示:

 int i = callbacks.beginBroadcast();
 while (i > 0) {
     i--;
     try {
         callbacks.getBroadcastItem(i).somethingHappened();
     } catch (RemoteException e) {
         // The RemoteCallbackList will take care of removing
         // the dead object for us.
     }
 }
 callbacks.finishBroadcast();

相反,请求有许多不同的类型,因此我需要跟踪我要将结果发送回的确切接口对象。每个单独的请求可能涉及进一步的异步Web请求和/或处理,并且不得不将回调对象传递给其中的每一个(通过构造函数或只是方法参数)是我觉得我将要做的事情非常繁琐冗长的解决问题,我或许可以简单地实现另一种方式?

如果我能保证第一个请求是第一个结果,并且因此只是在删除对它们的引用之前使用RemoteCallbackList中的顺序,那么任务将变得容易,但由于这种情况不是这样的。不同请求类型的处理时间不同。

修改 - 看来RemoteCallbackListArrayMap支持,所以我认为没有订购?

我找不到任何记录的方法来缩小RemoteCallbackList中的回调所在的位置,尽管即使我可以,但我当然仍需要某种持久性标识符才能知道我在寻找什么....难倒。

感谢您阅读本文,欢迎任何想法。

编辑 - 出于伪示例的目的。想象一下,API请求是关于书籍的。

// requests
bookExists(String title)
bookContent(String title)

// response
bookExists(boolean exists)
bookContent(ArrayList<String> words, int pageTotal)

从上面可以看出,所有条件相同,对较小书籍的远程请求或书籍的存在,可能会在请求更长的书籍之前完成并准备回应,即使它是要求之后。这是我需要跟踪“请求者”的地方。并且是我之后的设计。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,那么您所要做的就是使用相同的界面响应来自RemoteCallbackList的请求,但具有不同的响应数据结构。

我想,最简单的方法是让请求为您提供他们想要的返回数据结构的信息。最明显的(甚至可能是愚蠢的)方式是向您发送您必须实例化并填写的类的名称。以更复杂的方式,您可以创建一些枚举,应该根据请求提供项目名称,这将定义正确的要实例化和返回的数据结构类。

第二种方法是使用某种响应解析器 - 一些逻辑可以检测请求可能需要的数据类型。但恕我直言,它看起来太模糊,相当复杂,不太方便支持。

无论如何 - 你会为这种情况找到一些通用的解决方案是非常值得怀疑的,因为它不是一个常见的解决方案。

希望这有帮助。