Metode Antarmuka & Kesalahan

Bagian ini merinci metode antarmuka dan kesalahan.

Batalkan metode

Metode yang tidak mengembalikan hasil diterjemahkan ke dalam metode Java yang mengembalikan void . Misalnya, deklarasi HIDL:

doThisWith(float param);

… menjadi:

void doThisWith(float param);

Metode hasil tunggal

Metode yang mengembalikan satu hasil diterjemahkan ke dalam Java yang setara dan juga mengembalikan satu hasil. Misalnya saja berikut ini:

doQuiteABit(int32_t a, int64_t b,
            float c, double d) generates (double something);

… menjadi:

double doQuiteABit(int a, long b, float c, double d);

Metode hasil ganda

Untuk setiap metode yang mengembalikan lebih dari satu hasil, kelas panggilan balik dihasilkan yang menyediakan semua hasil dalam metode onValues -nya. Callback tersebut bertindak sebagai parameter tambahan pada metode tersebut. Misalnya saja berikut ini:

oneProducesTwoThings(SomeEnum x) generates (double a, double b);

… menjadi:

public interface oneProducesTwoThingsCallback {
    public void onValues(double a, double b);
}
void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);

Penelepon oneProducesTwoThings() biasanya menggunakan inner class atau lambda anonim untuk mengimplementasikan callback secara lokal:

someInstanceOfFoo.oneProducesTwoThings(
         5 /* x */,
         new IFoo.oneProducesTwoThingsCallback() {
          @Override
          void onValues(double a, double b) {
             // do something interesting with a and b.
             ...
          }});

atau:

someInstanceOfFoo.oneProducesTwoThings(5 /* x */,
    (a, b) -> a > 3.0 ? f(a, b) : g(a, b)));

Anda juga dapat menentukan kelas untuk digunakan sebagai panggilan balik…

class MyCallback implements oneProducesTwoThingsCallback {
  public void onValues(double a, double b) {
    // do something interesting with a and b.
  }
}

… dan meneruskan instance MyCallback sebagai parameter ketiga ke oneProducesTwoThings() .

Kesalahan transportasi dan kematian penerima

Karena implementasi layanan dapat berjalan dalam proses yang berbeda, dalam beberapa kasus klien dapat tetap hidup bahkan ketika proses yang mengimplementasikan antarmuka mati. Panggilan pada objek antarmuka yang dihosting dalam proses mati gagal dengan kesalahan transport (pengecualian runtime yang diberikan oleh metode yang dipanggil). Pemulihan dari kegagalan tersebut dimungkinkan dengan meminta contoh layanan baru dengan memanggil I<InterfaceName>.getService() . Namun, metode ini hanya berfungsi jika proses yang mogok telah dimulai ulang dan mendaftarkan ulang layanannya ke manajer layanan (yang umumnya berlaku untuk implementasi HAL).

Klien suatu antarmuka juga dapat mendaftarkan penerima kematian untuk mendapatkan pemberitahuan ketika layanan mati. Kesalahan transportasi masih dapat terjadi jika panggilan dilakukan saat server mati. Untuk mendaftar pemberitahuan tersebut pada antarmuka IFoo yang diambil, klien dapat melakukan hal berikut:

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

Parameter recipient harus merupakan implementasi antarmuka HwBinder.DeathRecipient yang disediakan oleh HIDL. Antarmuka berisi metode tunggal serviceDied() yang dipanggil ketika proses yang menghosting antarmuka mati.

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

Parameter cookie berisi cookie yang diteruskan dengan panggilan ke linkToDeath() . Dimungkinkan juga untuk membatalkan pendaftaran penerima kematian setelah mendaftarkannya menggunakan:

foo.unlinkToDeath(recipient);