Phần này trình bày chi tiết về các lỗi và phương thức giao diện.
Phương thức vô hiệu
Các phương thức không trả về kết quả sẽ được dịch thành các phương thức Java
trả về void
. Ví dụ: nội dung khai báo HIDL:
doThisWith(float param);
... trở thành:
void doThisWith(float param);
Phương thức một kết quả
Các phương thức trả về một kết quả duy nhất sẽ được dịch sang Java tương đương cũng trả về một kết quả duy nhất. Ví dụ như sau:
doQuiteABit(int32_t a, int64_t b, float c, double d) generates (double something);
... trở thành:
double doQuiteABit(int a, long b, float c, double d);
Phương thức nhiều kết quả
Đối với mỗi phương thức trả về nhiều kết quả, lớp gọi lại sẽ
được tạo để cung cấp tất cả kết quả trong phương thức onValues
.
Lệnh gọi lại đó đóng vai trò là một tham số bổ sung cho phương thức. Ví dụ:
sau:
oneProducesTwoThings(SomeEnum x) generates (double a, double b);
... trở thành:
public interface oneProducesTwoThingsCallback { public void onValues(double a, double b); } void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);
Phương thức gọi của oneProducesTwoThings()
thường sử dụng
lớp bên trong ẩn danh hoặc lambda để triển khai lệnh gọi lại trên máy:
someInstanceOfFoo.oneProducesTwoThings( 5 /* x */, new IFoo.oneProducesTwoThingsCallback() { @Override void onValues(double a, double b) { // do something interesting with a and b. ... }});
hoặc:
someInstanceOfFoo.oneProducesTwoThings(5 /* x */, (a, b) -> a > 3.0 ? f(a, b) : g(a, b)));
Bạn cũng có thể xác định một lớp để dùng làm lệnh gọi lại...
class MyCallback implements oneProducesTwoThingsCallback { public void onValues(double a, double b) { // do something interesting with a and b. } }
... rồi truyền một thực thể của MyCallback
dưới dạng tham số thứ ba đến
oneProducesTwoThings()
Lỗi truyền tải và người nhận tử vong
Vì quá trình triển khai dịch vụ có thể chạy trong một quy trình khác, nên trong một số trường hợp
ứng dụng có thể hoạt động ngay cả khi quy trình triển khai một giao diện bị gián đoạn.
Không thực hiện được lệnh gọi trên một đối tượng giao diện được lưu trữ trong một quy trình cụ thể trong quá trình truyền tải
lỗi (một ngoại lệ thời gian chạy được gửi bởi phương thức được gọi). Khôi phục từ
không thể xảy ra bằng cách yêu cầu một bản sao mới của dịch vụ bằng cách gọi
I<InterfaceName>.getService()
. Tuy nhiên, phương pháp này hiệu quả
chỉ khi quy trình gặp sự cố đã khởi động lại và đăng ký lại dịch vụ
với servicemanager (thường đúng với việc triển khai HAL).
Ứng dụng của một giao diện cũng có thể đăng ký người nhận đã chết để nhận
khi một dịch vụ bị vô hiệu hoá. Lỗi truyền tải vẫn có thể xảy ra nếu lệnh gọi được
thực hiện ngay khi máy chủ chết. Để đăng ký nhận các thông báo như vậy trên truy xuất,
IFoo
, ứng dụng có thể thực hiện những việc sau:
foo.linkToDeath(recipient, 1481 /* cookie */);
Tham số recipient
phải là triển khai của
giao diện HwBinder.DeathRecipient
do HIDL cung cấp. Giao diện
chứa một phương thức serviceDied()
duy nhất được gọi khi
quá trình lưu trữ giao diện bị lỗi.
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
Tham số cookie
chứa cookie đã được truyền cùng
lệnh gọi đến linkToDeath()
. Bạn cũng có thể huỷ đăng ký tài khoản đã chết
người nhận sau khi đăng ký bằng:
foo.unlinkToDeath(recipient);