本节详细介绍了接口方法和错误。
Void 方法
不返回结果的方法会转换为返回 void
的 Java 方法。例如,HIDL 声明
doThisWith(float param);
… 变为
void doThisWith(float param);
单结果方法
返回单个结果的方法会转换为其 Java 等效方法,后者也返回单个结果。例如,以下代码
doQuiteABit(int32_t a, int64_t b, float c, double d) generates (double something);
… 变为
double doQuiteABit(int a, long b, float c, double d);
多结果方法
对于每个返回多个结果的方法,都会生成一个回调类,该类在其 onValues
方法中提供所有结果。该回调充当该方法的附加参数。例如,以下代码
oneProducesTwoThings(SomeEnum x) generates (double a, double b);
… 变为
public interface oneProducesTwoThingsCallback { public void onValues(double a, double b); } void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);
oneProducesTwoThings()
的调用方通常会使用匿名内部类或 lambda 在本地实现回调
someInstanceOfFoo.oneProducesTwoThings( 5 /* x */, new IFoo.oneProducesTwoThingsCallback() { @Override void onValues(double a, double b) { // do something interesting with a and b. ... }});
或
someInstanceOfFoo.oneProducesTwoThings(5 /* x */, (a, b) -> a > 3.0 ? f(a, b) : g(a, b)));
您还可以定义一个类用作回调…
class MyCallback implements oneProducesTwoThingsCallback { public void onValues(double a, double b) { // do something interesting with a and b. } }
… 并将 MyCallback
的实例作为第三个参数传递给 oneProducesTwoThings()
。
传输错误和死亡接收器
由于服务实现在不同的进程中运行,因此在某些情况下,即使实现接口的进程终止,客户端也可以保持活动状态。对托管在已终止进程中的接口对象进行的调用将失败,并显示传输错误(被调用方法抛出的运行时异常)。通过调用 I<InterfaceName>.getService()
请求服务的新实例,可以从此类故障中恢复。但是,此方法仅在崩溃的进程已重启并向 servicemanager 重新注册其服务后才有效(这通常适用于 HAL 实现)。
接口的客户端还可以注册死亡接收器,以便在服务终止时收到通知。如果在服务器终止时发出调用,仍可能发生传输错误。要在检索到的 IFoo
接口上注册此类通知,客户端可以执行以下操作
foo.linkToDeath(recipient, 1481 /* cookie */);
recipient
参数必须是 HIDL 提供的接口 HwBinder.DeathRecipient
的实现。该接口包含一个在托管接口的进程终止时调用的 serviceDied()
方法。
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
cookie
参数包含通过调用 linkToDeath()
传递的 Cookie。也可以在使用以下命令注册死亡接收器后取消注册:
foo.unlinkToDeath(recipient);