Metode dan error antarmuka

Bagian ini menjelaskan metode dan error antarmuka.

Metode void

Metode yang tidak menampilkan hasil diterjemahkan menjadi metode Java yang menampilkan void. Misalnya, deklarasi HIDL:

doThisWith(float param);

… menjadi:

void doThisWith(float param);

Metode hasil tunggal

Metode yang menampilkan satu hasil diterjemahkan ke dalam metode Java yang setara dan juga menampilkan satu hasil. Misalnya, hal berikut:

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 beberapa hasil

Untuk setiap metode yang menampilkan lebih dari satu hasil, class callback akan dibuat yang menyediakan semua hasil dalam metode onValues-nya. Callback tersebut berfungsi sebagai parameter tambahan untuk metode. Misalnya, hal berikut:

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 teruskan instance MyCallback sebagai parameter ketiga ke oneProducesTwoThings().

Error transportasi dan penerima kematian

Karena implementasi layanan dapat berjalan dalam proses yang berbeda, dalam beberapa kasus, klien dapat tetap aktif meskipun proses yang mengimplementasikan antarmuka berhenti. Panggilan pada objek antarmuka yang dihosting dalam proses yang mati akan gagal dengan error transpor (pengecualian runtime yang ditampilkan oleh metode yang dipanggil). Pemulihan dari kegagalan tersebut dapat dilakukan dengan meminta instance layanan baru dengan memanggil I<InterfaceName>.getService(). Namun, metode ini hanya berfungsi jika proses yang mengalami 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 mati. Error transpor masih dapat terjadi jika panggilan dilakukan tepat saat server mati. Untuk mendaftar ke notifikasi tersebut di antarmuka IFoo yang diambil, 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 proses yang menghosting antarmuka berhenti.

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(). Anda juga dapat membatalkan pendaftaran penerima kematian setelah mendaftarkannya menggunakan:

foo.unlinkToDeath(recipient);