Phương thức giao diện và lỗi

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);