Metode dan error antarmuka

Bagian ini menjelaskan metode dan error antarmuka.

Metode kosong

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

doThisWith(float param);

... menjadi:

void doThisWith(float param);

Metode hasil tunggal

Metode yang menampilkan hasil tunggal diterjemahkan ke dalam bahasa Java-nya atau setara yang juga menampilkan satu hasil. Misalnya, 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 multi-hasil

Untuk setiap metode yang menampilkan lebih dari satu hasil, class callback adalah yang menyediakan semua hasil dalam metode onValues-nya. Callback tersebut bertindak sebagai parameter tambahan pada metode. Misalnya, 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);

Pemanggil oneProducesTwoThings() biasanya akan menggunakan class dalam 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 class yang akan digunakan sebagai callback ...

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().

Error saat transportasi dan penerima kematian

Karena implementasi layanan dapat berjalan dalam proses yang berbeda, dalam beberapa kasus klien dapat tetap hidup bahkan ketika proses yang mengimplementasikan antarmuka dihentikan. Panggilan pada objek antarmuka yang dihosting dalam proses mati yang gagal dengan transpor error (pengecualian runtime yang ditampilkan oleh metode yang dipanggil). Pemulihan dari gagal dimungkinkan dengan meminta {i>instance<i} layanan baru dengan memanggil I<InterfaceName>.getService(). Namun, metode ini berfungsi hanya jika proses yang error telah dimulai ulang dan mendaftarkan ulang layanannya dengan servicemanager (yang umumnya berlaku untuk implementasi HAL).

Klien antarmuka juga dapat mendaftarkan penerima kematian untuk mendapatkan notifikasi saat layanan berhenti berfungsi. Error transportasi masih bisa terjadi jika panggilan dibuat ketika server mati. Untuk mendaftar notifikasi tersebut pada panggilan yang diambil IFoo, klien dapat melakukan hal berikut:

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

Parameter recipient harus berupa implementasi antarmuka HwBinder.DeathRecipient yang disediakan oleh HIDL. Antarmuka berisi satu metode serviceDied() yang dipanggil saat maka proses {i>hosting<i} antarmuka tersebut akan 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 kematian penerima setelah mendaftarkannya menggunakan:

foo.unlinkToDeath(recipient);