Callback didefinisikan di Wikipedia sebagai:
Dalam pemrograman komputer, fungsi panggilan balik mengacu pada referensi ke sepotong kode yang dapat dieksekusi tertentu yang diteruskan ke kode lain melalui parameter fungsi.
Tujuannya adalah untuk memungkinkan kode yang mendasarinya memanggil subrutin yang ditentukan pada tingkat yang lebih tinggi.
Misalnya, mungkin lebih jelas: menggunakan retrofit untuk permintaan jaringan di Android sebagai contoh, ini adalah contoh dari panggilan balik asinkron.
Setelah memulai permintaan jaringan, aplikasi dapat melanjutkan hal -hal lain. Hasil permintaan jaringan umumnya diperoleh melalui dua metode respons dan onfailure. Lihatlah kode di bagian yang relevan:
call.enqueue (callback baru <HorpokyBean> () {@Override public void onResponse (call <HistoryBean> Panggilan, respons <spesponseBean> respons) {historybean hb = response.body (); if (hb == null) return; showtext.Peramping (hb.iserror (); for (hb = for (for); hb.getResults ()) {showText.append (rb.gettitle () + "/n");Abaikan obat generik dalam panggilan balik di atas. Menurut definisi di Wikipedia, semua kode dalam kelas internal anonim dapat dianggap sebagai referensi ke kode yang dapat dieksekusi tertentu yang diteruskan ke kode lain . Dua metode OnResponse dan Onfailure adalah metode panggilan balik. Kode yang mendasari adalah bagian permintaan jaringan yang tidak berubah yang telah ditulis, dan subrutin yang ditentukan oleh level yang lebih tinggi adalah panggilan balik. Karena implementasi spesifik diserahkan kepada pengguna, ia memiliki fleksibilitas tinggi. Di atas terkait melalui metode enqueue (callback callback).
Langkah -langkah metode panggilan balik
Callback yang disebutkan di atas adalah konsep yang sangat umum. Jika Anda meletakkannya pada penulisan program, Anda dapat mengatakan:
Di Kelas A, metode C di Kelas B dipanggil, dan kemudian di Kelas B, Metode D di Kelas A dipanggil secara terbalik. D adalah metode panggilan balik. Kelas B adalah kode yang mendasarinya, dan Kelas A adalah kode tingkat tinggi.
Jadi melalui penjelasan di atas, kita dapat menyimpulkan sesuatu. Untuk mewakili universalitas metode D, kami menggunakan formulir antarmuka untuk membuat metode D disebut metode antarmuka. Jika Kelas B ingin memanggil metode D di kelas A, maka kelas A harus mengimplementasikan antarmuka ini. Dengan cara ini, tergantung pada implementasinya, akan ada polimorfisme, membuat metode ini fleksibel.
Jika kelas A ingin memanggil metode C di kelas B, maka kelas A harus berisi referensi ke B, jika tidak, itu tidak akan dipanggil. Langkah ini disebut antarmuka panggilan balik pendaftaran. Jadi cara mengimplementasikan metode panggilan terbalik D di kelas A di kelas B, langsung melalui metode di atas C. Metode C di Kelas B menerima parameter tipe antarmuka. Kemudian, hanya dalam metode C, Anda perlu menggunakan parameter jenis antarmuka ini untuk memanggil metode D di kelas B, yang pada gilirannya panggilan metode D di kelas A. Langkah ini disebut panggilan antarmuka callback.
Ini juga mengimplementasikan bahwa dalam metode C Kelas B, metode D di Kelas A perlu dipanggil secara terbalik, yang merupakan panggilan balik. A Panggilan B Untuk langsung menyetel, yang dapat dianggap sebagai menggunakan API yang mendasari untuk kode tingkat tinggi. Kami sering menulis program seperti ini. B memanggil A untuk menelepon kembali, dan API yang mendasarinya membutuhkan kode tingkat tinggi untuk dieksekusi.
Akhirnya, mari kita ringkas langkah -langkah metode panggilan balik:
Contoh panggilan balik
Mari kita ambil anak laki -laki bermain game dan menunggu ibunya menyiapkan makanan dan memberi tahu putranya untuk datang dan makan sebagai contoh, dan mengikuti langkah -langkah di atas untuk menulis panggilan balik;
Dalam contoh di atas, jelas bahwa putra harus menerapkan antarmuka panggilan balik dan ibu harus memanggil antarmuka callback. Jadi pertama -tama kami mendefinisikan antarmuka panggilan balik, dan kemudian membiarkan putra kami mengimplementasikan antarmuka callback ini.
Kodenya adalah sebagai berikut:
callback antarmuka publik {void eat ();} putra kelas publik mengimplementasikan callback {private mom mom; // Kelas A memegang referensi ke public b void kelas B setMom (mom mom) {this.mom = mom; } @Override public void eat () {System.out.println ("Aku di sini untuk makan"); } public void askmom () {// Memanggil metode dengan parameter antarmuka melalui referensi ke kelas B. System.out.println ("Apakah makanan sudah dimasak?"); System.out.println ("Belum selesai, saya bermain game"); utas baru (() -> mom.docook (son.this)). start (); System.out.println ("Playing the Game ..."); }}Maka kita juga perlu mendefinisikan kelas ibu, yang berisi metode dokumen dengan parameter antarmuka
Kelas Publik Mom {// Panggilan metode panggilan balik menggunakan parameter antarmuka dalam metode yang berisi parameter antarmuka public void docook (callback callback) {thread baru (runnable baru () {@Override public void run () {cobalah {System.out.println ("cooking ..."); thread.sleep (5000); callback.out.out.println ("cooking ..."); thread. E.PrintStackTrace ();}}}). Start (); }}Kami lulus kelas tes:
tes kelas publik {public static void main (string [] args) {mom mom = new mom (); Anak laki -laki = anak baru (); son.setmom (ibu); son.askmom (); }}Contoh ini adalah contoh panggilan balik yang khas. Kelas Son mengimplementasikan metode callback antarmuka. Ini memanggil Docook di kelas Mom melalui metode AskMom untuk mendaftarkan antarmuka panggilan balik, yang setara dengan memanggil Kode B Kelas B di Kelas A. Docook di kelas ibu panggilan bolak -balik kelas Eat in the Son untuk mengetahui hasilnya di kelas Son.
Dengan cara ini, kami menerapkan panggilan balik yang sederhana dan jelas.
Eksplorasi lebih lanjut dari contoh panggilan balik
Mari kita lihat Kode Kelas Son:
putra kelas publik mengimplementasikan panggilan balik {ibu publik; putra publik (ibu ibu) {this.mom = mom; } public void askmom () {System.out.println ("Apakah makanan sudah matang?"); System.out.println ("Saya belum melakukannya dengan baik, saya sudah memainkan game"); utas baru (() -> mom.docook (son.this)). start (); System.out.println ("Saya bermain game ..."); } @Override public void eat () {System.out.println ("Oke, saya di sini untuk makan"); }}Di kelas ini, selain mengeluarkan beberapa pernyataan, bagian yang sangat berguna adalah Mom.docook (Son.ini) dan menulis ulang metode makan. Oleh karena itu, kita dapat menyingkat panggilan balik ini melalui bentuk kelas dalam anonim. Kodenya adalah sebagai berikut:
Public Class CallbackTest {public static void main (string [] args) {mom mom = new mom (); utas baru (() -> mom.docook (() -> system.out.println ("Saya sudah makan ..."))). start (); }}Batalkan kelas Son dan langsung mengimplementasikan metode makan melalui kelas dalam anonim dalam metode utama. Faktanya, kelas internal anonim adalah perwujudan panggilan balik.
Panggilan balik asinkron dan panggilan balik sinkron
Callback: Metode Panggilan C di Kelas B, dan kemudian panggilan metode D di Kelas A melalui Kelas A Objek dalam Metode C.
Mari kita bicara tentang asinkron dan sinkronisasi, mari kita bicara tentang konsep sinkronisasi terlebih dahulu.
sinkronis
Sinkronisasi berarti bahwa ketika memanggil metode, jika panggilan metode sebelumnya tidak dieksekusi, panggilan metode baru tidak dapat dilakukan. Dengan kata lain, hal -hal harus dilakukan satu per satu, dan Anda hanya dapat melakukan yang berikutnya.
asinkron
Asynchronousness relatif terhadap sinkronisasi, Anda tidak perlu menunggu sampai panggilan metode sebelumnya selesai sebelum memanggil metode baru. Oleh karena itu, dalam panggilan metode asinkron, metode diperlukan untuk memberi tahu pengguna tentang hasil panggilan metode.
Menerapkan metode asinkron
Cara paling umum untuk mengimplementasikan asinkron di Java adalah membiarkan metode yang ingin Anda jalankan secara tidak sinkron di utas baru.
Kami akan menemukan bahwa metode diperlukan dalam panggilan metode asinkron untuk memberi tahu hasil panggilan pengguna. Berdasarkan hal di atas, kami akan menemukan bahwa metode callback cocok untuk melakukan ini, dan memberi tahu pengguna hasil panggilan melalui metode callback.
Panggilan balik asinkron dilakukan di utas baru ketika metode panggilan C dari B.
Contoh ibu yang memberi tahu putranya di atas untuk makan malam adalah contoh dari panggilan balik asinkron. Di utas baru, metode Docook dipanggil dan nilai pengembalian akhirnya diterima melalui EAT. Tentu saja, setelah menggunakan optimasi LAMDBA, esensinya sama.
Callback sinkron berarti bahwa A Calls B Metode C tidak di utas baru. Saat menjalankan metode ini C, kita tidak dapat melakukan apa pun dan hanya bisa menunggu untuk menyelesaikannya.
Contoh panggilan balik sinkron dan panggilan balik asinkron
Mari kita lihat contoh panggilan balik sinkron di Android:
Button.setOnClickListener (view.onClickListener baru () {@Override public void onClick (view v) {log.i ("tombol", "diklik");});Tombol mendaftarkan fungsi callback melalui setOnClickListener , dan seperti yang ditulis di atas, melewati referensi antarmuka dalam bentuk kelas internal anonim. Karena tombol memanggil SetOnClickListener tanpa membuat utas baru, ini adalah panggilan balik sinkron.
Callback asinkron adalah contoh yang kita bicarakan di awal:
call.enqueue (callback baru <HorpokyBean> () {@Override public void onResponse (call <HistoryBean> Panggilan, respons <spesponseBean> respons) {historybean hb = response.body (); if (hb == null) return; showtext.Peramping (hb.iserror (); for (hb = for (for); hb.getResults ()) {showText.append (rb.gettitle () + "/n");Metode enqueue ini adalah metode asinkron untuk meminta data jaringan jarak jauh. Ketika diimplementasikan secara internal, itu dieksekusi melalui utas baru.
Melalui dua contoh ini, kita dapat melihat bahwa penggunaan panggilan balik sinkron dan panggilan balik asinkron sebenarnya dirancang sesuai dengan kebutuhan yang berbeda. Tidak dapat dikatakan bahwa satu menggantikan yang lain. Misalnya, dalam acara klik tombol di atas, jika itu adalah panggilan balik asinkron, efek klik tidak muncul segera setelah pengguna mengklik tombol, dan pengguna tidak akan melakukan operasi lain, itu akan terasa aneh. Panggilan balik asinkron untuk permintaan jaringan, karena sumber daya yang diminta mungkin tidak ada, koneksi jaringan tidak stabil, dan alasan lain, pengguna tidak jelas tentang pelaksanaan metode, sehingga mereka akan menggunakan panggilan balik asinkron, memulai panggilan metode dan melakukan hal -hal lain, dan kemudian menunggu pemberitahuan callback.
Penerapan metode panggilan balik dalam komunikasi
Metode panggilan balik yang disebutkan di atas, kecuali untuk panggilan balik dari kerangka permintaan jaringan, semuanya tidak memiliki parameter. Mari kita lihat menambahkan parameter ke metode panggilan balik untuk menerapkan beberapa masalah komunikasi.
Jika kami ingin Kelas A mendapatkan data Kelas B setelah serangkaian perhitungan dan pemrosesan, dan kedua kelas tidak dapat hanya merujuk ke data Kelas A. Kami dapat mempertimbangkan panggilan balik.
Langkah -langkahnya adalah sebagai berikut:
Langkah -langkah yang disebutkan di atas agak abstrak. Mari kita lihat contoh di bawah ini, yang satu adalah klien dan yang lainnya adalah server. Klien meminta data yang memakan waktu server.
klien kelas publik {server server publik; permintaan string publik; // tautan server dan dapatkan referensi server. Klien Publik Connect (Server Server) {this.server = server; kembalikan ini; } // klien, set permintaan klien publik setRequest (permintaan string) {this.Request = request; kembalikan ini; } // AKEQUENTENSI Kirim metode permintaan, ekspresi LAMDBA. public void enqueue (server.callback callback) {utas baru (()-> server.setCallback (permintaan, callback)). start (); }} server kelas publik {respons public string = "Ini adalah html"; // Daftarkan metode antarmuka callback dan lewati data ke antarmuka callback melalui parameter public void setCallback (permintaan string, callback callback) {System.out.println ("Permintaan telah diterima dan sedang dihitung ..."); Thread baru (() -> {coba {thread.sleep (5000); callback.onResponse (request + response);} catch (interruptedException e) {e.printstacktrace (); callback.onfail (e);}}). start (); } // Tulis antarmuka di kelas yang memiliki Callback Antarmuka Publik Data {void OnResponse (String Response); void onfail (lempar lempar); }}Selanjutnya, mari kita lihat contoh tes:
kelas publik callbackTest {public static void main (string [] args) {client client = new client (); client.connect (server baru ()). setRequest ("Apa file ini?"). enqueue (server.callback baru () {@Override public void onResponse (string response) {System.out.println (respons);} @Override public void onfail (lempar lempar) {System.out.out.outs); }}Hasilnya adalah sebagai berikut:
Permintaan telah diterima dan sedang dihitung ... apa file ini? Ini adalah HTML
Di atas adalah berkomunikasi melalui panggilan balik.
Di atas adalah semua konten artikel ini. Saya berharap konten artikel ini akan membantu untuk belajar atau bekerja semua orang. Saya juga berharap untuk mendukung wulin.com lebih lanjut!