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);