Nilai pulangan kaedah ialah pengguna, jadi kaedah ini tidak boleh dipanggil kaedah tak segerak. Melainkan kaedah ini mengembalikan masa depan, atau sesuatu seperti rujukan yang boleh mendapatkan hasilnya kemudian, kaedah ini boleh dipanggil kaedah tak segerak. Jika anda ingin mendapatkan pengguna selepas melaraskan kaedah, maka tidak perlu meletakkan kod tak segerak dalam kaedah, yang tidak bermakna sama sekali.
Hasil tak segerak hanya boleh dikembalikan melalui panggilan balik.
Kaedah penyegerakan biasanya seperti ini
public User syncGetUser() {
User user = heavyWork();
return user;
}
Memandangkan kaedah heavyWork mungkin perlu menyemak pangkalan data atau melakukan banyak pengiraan, kaedah heavyWork akan mengambil banyak masa untuk dilaksanakan. Jika anda tidak mahu menunggu lama, di sinilah asynchronous berguna.
public Future<User> asyncGetUser() {
Future<User> future = threadPool.submit(new Callable<User> {
public User call() throws Exception {
return heavyWork();
}
}
return future;
}
Pada ketika ini, heavyWork telah diserahkan kepada rangkaian lain untuk dijalankan, dan masa depan dikembalikan kepada anda. Selepas itu, anda boleh mendapatkan pengguna yang anda inginkan melalui kaedah get masa hadapan ini.
Ini adalah maksud dan kegunaan tak segerak. Tajuk itu sendiri bercanggah. Mengembalikan hasil pelaksanaan tak segerak dalam kaedah yang mengandungi kod tak segerak ialah percanggahan.
Saya tidak mempelajari RxJava, tetapi rakan sekerja saya yang melakukan pembangunan Android dalam pasukan sebelumnya berkata ia sangat berguna.
Tingkat 1 memberikan penyelesaian menggunakan Future, tetapi malangnya Future ialah API penyekat tak segerak, iaitu tiada panggilan balik pemberitahuan.
Bagi cara melaksanakan panggilan balik, ini sepatutnya sangat asas. Lihat sahaja corak pemerhati.
Tetapi anda boleh menggunakan google guava, yang menyediakan Masa Depan yang dipertingkatkan dipanggil ListenableFuture.
Contoh di tingkat 1 dipetik di sini dan diubah suai.
class A implements FutureCallback{
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture futrue = service.submit(new Callable() {
public User call() {
return heavyWork();
}
});
Futures.addCallback(furtrue,this);
public void onSuccess(User user) {
//这个是回调执行的代码
}
public void onFailure(Throwable thrown) {
}
}
rx.java belum digunakan tetapi saya tahu kaedah dalam android, saya harap ia akan membantu anda. Menurut apa yang anda katakan, jika hasil pulangan tak segerak digunakan dalam kaedah utama, anda mesti mempertimbangkan komunikasi antara benang Iaitu, tulis pengendali dahulu, dan tulis kaedah untuk menerima data, dan laksanakan pelaksanaan yang dikehendaki apabila data datang kaedah dan kemudian hantar data kepada pengendali selepas sub-benang selesai.
Nilai pulangan kaedah ialah pengguna, jadi kaedah ini tidak boleh dipanggil kaedah tak segerak. Melainkan kaedah ini mengembalikan masa depan, atau sesuatu seperti rujukan yang boleh mendapatkan hasilnya kemudian, kaedah ini boleh dipanggil kaedah tak segerak. Jika anda ingin mendapatkan pengguna selepas melaraskan kaedah, maka tidak perlu meletakkan kod tak segerak dalam kaedah, yang tidak bermakna sama sekali.
Hasil tak segerak hanya boleh dikembalikan melalui panggilan balik.
Kaedah penyegerakan biasanya seperti ini
Memandangkan kaedah heavyWork mungkin perlu menyemak pangkalan data atau melakukan banyak pengiraan, kaedah heavyWork akan mengambil banyak masa untuk dilaksanakan.
Jika anda tidak mahu menunggu lama, di sinilah asynchronous berguna.
Pada ketika ini, heavyWork telah diserahkan kepada rangkaian lain untuk dijalankan, dan masa depan dikembalikan kepada anda.
Selepas itu, anda boleh mendapatkan pengguna yang anda inginkan melalui kaedah get masa hadapan ini.
Ini adalah maksud dan kegunaan tak segerak. Tajuk itu sendiri bercanggah. Mengembalikan hasil pelaksanaan tak segerak dalam kaedah yang mengandungi kod tak segerak ialah percanggahan.
Saya tidak mempelajari RxJava, tetapi rakan sekerja saya yang melakukan pembangunan Android dalam pasukan sebelumnya berkata ia sangat berguna.
Tingkat 1 memberikan penyelesaian menggunakan Future, tetapi malangnya Future ialah API penyekat tak segerak, iaitu tiada panggilan balik pemberitahuan.
Bagi cara melaksanakan panggilan balik, ini sepatutnya sangat asas. Lihat sahaja corak pemerhati.
Tetapi anda boleh menggunakan google guava, yang menyediakan Masa Depan yang dipertingkatkan dipanggil ListenableFuture.
Contoh di tingkat 1 dipetik di sini dan diubah suai.
"Pemulangan" kaedah tak segerak berlaku sebelum kod dilaksanakan. Kod belum dilaksanakan lagi, bagaimanakah hasilnya boleh dikembalikan?
Saya rasa boleh juga menggunakan kaedah panggil balik
Gunakan CountDownLatch untuk menukar operasi tak segerak kepada operasi segerak.
selak CountDownLatch akhir = CountDownLatch(1) baharu
Panggil kaedah tak segerak.Dalam hasil panggilan balik tak segerak,
cuba {latch.countDown();
Kemudian
} tangkapan (InterruptedException e) { }
kembali data;
Terdapat urutan dalam java yang mengembalikan antara muka Boleh Panggil
rx.java belum digunakan
tetapi saya tahu kaedah dalam android, saya harap ia akan membantu anda.
Menurut apa yang anda katakan, jika hasil pulangan tak segerak digunakan dalam kaedah utama, anda mesti mempertimbangkan komunikasi antara benang
Iaitu, tulis pengendali dahulu, dan tulis kaedah untuk menerima data, dan laksanakan pelaksanaan yang dikehendaki apabila data datang kaedah
dan kemudian hantar data kepada pengendali selepas sub-benang selesai.