bra*_*all 8 java service android callback aidl
我有一个情况我觉得我要推倒重来还是走房前屋后,处理事情,已经有一个"设计"了 - 所以我做之前,我希望我能得到第二个意见,请.
我有一个远程服务.由于应用程序本身的不寻常特性/功能,它是永久性的前台服务.
我正在编写一个库,以便第三方应用程序可以绑定到服务并使用我公开的API.正如我在处理线程我和大部分的回调将是一个异步的性质,我使用的是AIDL方式,与被"瓜分了"提供必要的参数,以服务自定义类.到目前为止,一切都很完美.
我的服务代码的构造与RemoteService API示例非常相似,所以我将参考,因为发布我的特定代码不会改变问题.
作为与示例中,每个请求的接口I保存到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();
Run Code Online (Sandbox Code Playgroud)
相反,请求有许多不同的类型,因此我需要跟踪我要将结果发送回的确切接口对象.每个单独的请求可能涉及进一步的异步Web请求和/或处理,并且不得不将回调对象交给其中的每一个(通过构造函数或只是方法参数),我觉得我将要做一些非常乏味的事情.啰嗦地解决了一个问题,我或许可以简单地实现另一种方式?
如果我可以保证第一个请求将是第一个结果,并且因此在删除对它们的引用之前简单地使用RemoteCallbackList中的顺序,那么任务将变得容易,但由于处理时间的变化,情况并非如此.不同的请求类型.
编辑 - 看起来RemoteCallbackList由ArrayMap支持,所以我认为还没有订购?
我没有找到任何记录的方法来缩小RemoteCallbackList中的回调所在的位置,尽管即使我可以,我当然还需要某种持久性标识符才能知道我在寻找什么....难倒.
感谢您阅读本文,欢迎任何想法.
编辑 - 出于伪示例的目的.想象一下,API请求是关于书籍的.
// requests
bookExists(String title)
bookContent(String title)
// response
bookExists(boolean exists)
bookContent(ArrayList<String> words, int pageTotal)
Run Code Online (Sandbox Code Playgroud)
正如您从上面所看到的,在所有条件相同的情况下,对较小书籍的远程请求或书籍的存在,可能会在请求更长的书籍之前完成并准备好回复,即使之后请求了.这是我需要跟踪'请求者'的地方,也是我追求的设计.
如果我理解正确的话,您所要做的就是使用相同的接口但使用不同的响应数据结构来响应来自 RemoteCallbackList 的请求。
我想,最简单的方法是发出请求,向您提供他们想要什么样的返回数据结构的信息。最明显(甚至可能是愚蠢)的方法 - 是向您发送必须实例化并填写的类的名称。以更复杂的方式,您可以创建一些枚举,其中的项目名称应由请求带来,并且将定义正确的项目名称。要实例化并返回的数据结构类。
第二种方法是使用某种响应解析器 - 某种逻辑来检测请求可能需要哪种数据。但恕我直言,它看起来太模糊了,相当复杂,而且不太方便支持。
不管怎样——你是否会为这种情况找到一些通用的解决方案是非常值得怀疑的,因为它不是常见的。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |