blob: dc793f4166a9cbcec01a4507453bb45d3acdecd6 [file] [log] [blame]
<html devsite><head>
<title>接口方法和错误</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.yaml"/>
</head>
<body>
<!--
Copyright 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>本部分详细介绍了接口方法和错误。</p>
<h2 id="void">Void 方法</h2>
<p>不返回结果的方法将转换为返回 <code>void</code> 的 Java 方法。例如,HIDL 声明:</p>
<pre class="prettyprint">
doThisWith(float param);
</pre>
<p>…会变为:</p>
<pre class="prettyprint">
void doThisWith(float param);
</pre>
<h2 id="single-result">单结果方法</h2>
<p>返回单个结果的方法将转换为同样返回单个结果的 Java 等效方法。例如,以下方法:</p>
<pre class="prettyprint">
doQuiteABit(int32_t a, int64_t b,
float c, double d) generates (double something);
</pre>
<p>…会变为:</p>
<pre class="prettyprint">
double doQuiteABit(int a, long b, float c, double d);
</pre>
<h2 id="multiple-result">多结果方法</h2>
<p>对于返回多个结果的每个方法,系统都会生成一个回调类,在其 <code>onValues</code> 方法中提供所有结果。
该回调会用作此方法的附加参数。例如,以下方法:</p>
<pre class="prettyprint">
oneProducesTwoThings(SomeEnum x) generates (double a, double b);
</pre>
<p>…会变为:</p>
<pre class="prettyprint">
public interface oneProducesTwoThingsCallback {
public void onValues(double a, double b);
}
void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);
</pre>
<p><code>oneProducesTwoThings()</code> 的调用者通常使用匿名内部类或 lambda 在本地实现回调:</p>
<pre class="prettyprint">
someInstanceOfFoo.oneProducesTwoThings(
5 /* x */,
new IFoo.oneProducesTwoThingsCallback() {
@Override
void onValues(double a, double b) {
// do something interesting with a and b.
...
}});
</pre>
<p>或:</p>
<pre class="prettyprint">
someInstanceOfFoo.oneProducesTwoThings(5 /* x */,
(a, b) -&gt; a &gt; 3.0 ? f(a, b) : g(a, b)));
</pre>
<p>您还可以定义一个类以用作回调…</p>
<pre class="prettyprint">
class MyCallback implements oneProducesTwoThingsCallback {
public void onValues(double a, double b) {
// do something interesting with a and b.
}
}
</pre>
<p>…并传递 <code>MyCallback</code> 的一个实例作为 <code>oneProducesTwoThings()</code> 的第三个参数。</p>
<h2 id="errors">传输错误和死亡通知接收方</h2>
<p>由于服务实现可以在不同的进程中运行,在某些情况下,即使实现接口的进程已死亡,客户端也可以保持活动状态。
调用死亡进程中托管的接口对象会失败并返回传输错误(调用的方法抛出的运行时异常)。可以通过调用 <code>I&lt;InterfaceName&gt;.getService()</code> 以请求服务的新实例,从此类失败的调用中恢复。不过,仅当崩溃的进程已重新启动且已向 servicemanager 重新注册其服务时,这种方法才有效(对 HAL 实现而言通常如此)。</p>
<p>接口的客户端也可以注册一个死亡通知接收方,以便在服务终止时收到通知。<em></em>但如果在服务刚终止时发出调用,则仍然可能发生传输错误。要在检索的 <code>IFoo</code> 接口上注册此类通知,客户端可以执行以下操作:</p>
<pre class="prettyprint">
foo.linkToDeath(recipient, 1481 /* cookie */);
</pre>
<p><code>recipient</code> 参数必须是由 HIDL 提供的 <code>HwBinder.DeathRecipient</code> 接口的实现。该接口包含会在托管该接口的进程终止时调用的单个方法 <code>serviceDied()</code></p>
<pre class="prettyprint">
final class DeathRecipient implements HwBinder.DeathRecipient {
@Override
public void serviceDied(long cookie) {
// Deal with service going away
}
}
</pre>
<p><code>cookie</code> 参数包含使用 <code>linkToDeath()</code> 调用传递的 Cookie。在注册死亡通知接收方之后,也可以使用以下命令取消注册:</p>
<pre class="prettyprint">
foo.unlinkToDeath(recipient);
</pre>
</body></html>