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

Phần này trình bày chi tiết về các phương thức và lỗi giao diện.

Phương thức rỗng

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 có một kết quả

Các phương thức trả về một kết quả được dịch sang các phương thức tương đương trong Java cũng trả về một kết quả. Ví dụ:

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ả, một 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ụ: nội dung 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ẽ sử dụng một lớp bên trong hoặc lambda ẩn danh để triển khai lệnh gọi lại cục bộ:

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 để sử 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.
  }
}

… và truyền một thực thể của MyCallback làm tham số thứ ba cho oneProducesTwoThings().

Lỗi vận chuyển và người nhận đã chết

Vì việc 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ể vẫn hoạt động ngay cả khi quy trình triển khai giao diện bị gián đoạn. Các lệnh gọi trên đối tượng giao diện được lưu trữ trong một quy trình không hoạt động sẽ không thành công do lỗi truyền tải (một ngoại lệ thời gian chạy do phương thức được gọi gửi). Bạn có thể khôi phục lỗi này bằng cách yêu cầu một thực thể mới của dịch vụ bằng cách gọi I<InterfaceName>.getService(). Tuy nhiên, phương thức này chỉ hoạt động nếu quy trình gặp sự cố đã khởi động lại và đăng ký lại các dịch vụ của quy trình đó với trình quản lý dịch vụ (thường đúng với các hoạt động triển khai HAL).

Ứng dụng của một giao diện cũng có thể đăng ký một người nhận khi dịch vụ ngừng hoạt động để nhận thông báo khi một dịch vụ ngừng hoạt động. Lỗi truyền tải vẫn có thể xảy ra nếu một lệnh gọi được thực hiện ngay khi máy chủ ngừng hoạt động. Để đăng ký nhận các thông báo như vậy trên giao diện IFoo đã truy xuất, ứng dụng có thể làm như sau:

foo.linkToDeath(recipient, 1481 /* cookie */);

Tham số recipient phải là một phương thức triển khai giao diện HwBinder.DeathRecipient do HIDL cung cấp. Giao diện này chứa một phương thức serviceDied() duy nhất được gọi khi quy trình lưu trữ giao diện bị gián đoạn.

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 bằng lệnh gọi đến linkToDeath(). Bạn cũng có thể huỷ đăng ký người nhận thông báo về trường hợp tử vong sau khi đăng ký bằng cách sử dụng:

foo.unlinkToDeath(recipient);