Phương thức giao diện & Lỗi

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

Phương pháp trống

Các phương thức không trả về kết quả sẽ được dịch sang các phương thức Java trả về void . Ví dụ: khai báo HIDL:

doThisWith(float param);

… trở thành:

void doThisWith(float param);

Phương pháp kết quả đơn

Các phương thức trả về một kết quả duy nhất được dịch sang các giá trị tương đương Java của chú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 pháp đa 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ả các kết quả trong phương thức onValues ​​của nó. Cuộc gọi lại đó hoạt động như một tham số bổ sung cho phương thức. Ví dụ: như 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);

Người gọi 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 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ể định nghĩa 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à chuyển một phiên bản của MyCallback làm tham số thứ ba cho oneProducesTwoThings() .

Lỗi vận chuyển và người nhận tử vong

Bởi 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, máy khách có thể vẫn tồn tại ngay cả khi quy trình triển khai một giao diện bị hỏng. Các cuộc gọi trên một đối tượng giao diện được lưu trữ trong một tiến trình chết 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 đưa ra). Có thể phục hồi sau lỗi như vậy bằng cách yêu cầu một phiên bản 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 chỉ hoạt động nếu quá trình gặp sự cố đã khởi động lại và đăng ký lại dịch vụ của nó với trình quản lý dịch vụ (điều này thường đúng đối với việc triển khai HAL).

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

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

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

final class DeathRecipient implements HwBinder.DeathRecipient {
    @Override
    public void serviceDied(long cookie) {
        // Deal with service going away
    }
}

Tham số cookie chứa cookie được chuyển khi gọi tới linkToDeath() . Cũng có thể hủy đăng ký người nhận đã qua đời sau khi đăng ký bằng cách sử dụng:

foo.unlinkToDeath(recipient);