Metode & Kesalahan Antarmuka

Bagian ini merinci metode dan kesalahan antarmuka.

Metode batal

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 setara Java mereka juga mengembalikan 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 beberapa hasil

Untuk setiap metode yang mengembalikan lebih dari satu hasil, kelas panggilan balik dibuat yang memasok semua hasil dalam metode onValues -nya. Panggilan balik itu bertindak sebagai parameter tambahan untuk metode ini. 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 kelas dalam anonim atau lambda untuk mengimplementasikan panggilan balik 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 berikan instance MyCallback sebagai parameter ketiga ke oneProducesTwoThings() .

Kesalahan 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 mati. Panggilan pada objek antarmuka yang dihosting dalam proses mati gagal dengan kesalahan transportasi (pengecualian runtime dilemparkan oleh metode yang dipanggil). Pemulihan dari kegagalan semacam itu dimungkinkan dengan meminta instance layanan baru dengan memanggil I<InterfaceName>.getService() . Namun, metode ini hanya berfungsi jika proses yang macet telah dimulai ulang dan mendaftarkan ulang layanannya dengan pengelola layanan (yang umumnya berlaku untuk implementasi HAL).

Klien antarmuka juga dapat mendaftarkan penerima kematian untuk mendapatkan pemberitahuan saat layanan mati. Kesalahan transportasi masih dapat terjadi jika panggilan dilakukan tepat 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 dari antarmuka HwBinder.DeathRecipient yang disediakan oleh HIDL. Antarmuka berisi satu metode serviceDied() yang dipanggil saat 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() . Anda juga dapat membatalkan pendaftaran penerima kematian setelah mendaftarkannya menggunakan:

foo.unlinkToDeath(recipient);