本部分详细介绍了接口方法和错误。
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);