1. Tunda tindakan eksekusi
Itu dapat diimplementasikan menggunakan metode timer+peta. Kodenya adalah sebagai berikut:
Observable.timer (5, TimeUnit.Milliseconds) .map (value-> {return dosomething ();}). Berlangganan (System.out :: println); } 2. Tunda hasil pengiriman
Skenario ini mensyaratkan bahwa tindakan menghasilkan data dieksekusi segera, tetapi hasilnya tertunda dalam pengiriman. Ini berbeda dari skenario di atas.
Skenario ini dapat diimplementasikan menggunakan Observable.zip .
Operator ZIP menggabungkan data yang ditransmisikan oleh beberapa yang dapat diamati secara berurutan, setiap data hanya dapat digabungkan sekali, dan semuanya dipesan. Jumlah data gabungan akhir ditentukan oleh yang dapat diamati, yang mentransmisikan data paling sedikit.
Untuk data di lokasi yang sama dari setiap yang dapat diamati, Anda harus saling menunggu. Dengan kata lain, setelah data di lokasi pertama yang dapat diamati pertama dihasilkan, Anda harus menunggu data di lokasi pertama yang dapat diamati kedua yang dihasilkan, dan setelah data di lokasi yang sama dari setiap yang dapat diamati dihasilkan, Anda dapat menggabungkan sesuai dengan aturan yang ditentukan. Inilah yang ingin kami gunakan.
Ada banyak jenis deklarasi dalam ZIP, tetapi kira -kira sama, yaitu untuk disahkan dalam beberapa yang dapat diamati, kemudian menentukan aturan untuk memproses data di lokasi yang sesuai dari setiap yang dapat diamati, dan menghasilkan data baru. Ini salah satu yang paling sederhana:
Publik statis <T1, T2, R> Observable <r> Zip (Observable <? Extends T1> O1, Observable <? Extends T2> O2, FUNC2 Final <? Super T1 ,? Super T2 ,? Memperluas R> Zipfunction);
Hasil eksekusi Push and Send menggunakan ZIP adalah sebagai berikut:
Observable.zip (Observable.timer (5, Timeunit.Milliseconds), Observable.just (dosomething ()), (x, y)-> y) .subscribe (System.out :: println));
3. Gunakan tundukan untuk melakukan tindakan tertentu di utas yang ditentukan
Seperti dalam kode berikut, meskipun kami menentukan metode berjalan utas, fungsi doSomething() masih dieksekusi dalam utas yang dipanggil oleh kode saat ini.
Observable.
Biasanya kami menggunakan metode berikut untuk mencapai tujuan kami:
Observable.create (s-> {s.onnext (dosomething ());}) .subscribeon (scartulers.io ()) .observeon (schedulers.cputation ()) .subscribe (v-> {utils.printlnWithRead (v.toString ());});Namun pada kenyataannya, kita dapat mencapai tujuan yang sama dengan menggunakan Defer.
Tentang tunduk
Operator Defer sama dengan membuat, hanya, dari dan operator lainnya. Ini menciptakan operator kelas, tetapi semua data yang terkait dengan operator ini hanya berlaku jika Anda berlangganan.
penyataan:
public static <T> Observable <T> DISTRI (FUNC0 <Observable <T>> ObservableFactory);
Yang dapat diamati di func0 Defer dibuat hanya saat berlangganan.
memengaruhi:
Jangan buat yang dapat diamati sampai pengamat berlangganan; Buat segar yang dapat diamati pada setiap langganan.
Dengan kata lain, dapat diamati dibuat saat berlangganan.
Masalah di atas diimplementasikan dengan penundaan:
Observable.defer (()-> Observable.just (dosomething ())) .subscribeon (schedulers.io ()) .observeon (penjadwal.cputation ()) .subscribe (v-> {utils.printlnwiththread (v.toString ());}); 4. Jangan merusak struktur rantai menggunakan komposisi
Kita sering melihat kode berikut:
Observable.
Dalam kode di atas, subscribeOn(xxx).observeOn(xxx) mungkin sama di banyak tempat. Jika kami berencana untuk mengimplementasikannya di tempat tertentu, kami dapat menulisnya seperti ini:
private static <T> Diobservasi <T> ApplySChedulers (Observable <T> Observable) {return Observable.subscribeon (schedulers.io ()) .observeon (penjadwal. }Tetapi setiap kali kita perlu memanggil metode di atas, itu secara kasar akan seperti berikut ini, dan yang terluar adalah fungsi, yang setara dengan memecahkan struktur tautan:
ApplySChedulers (Observable.From (SomeSource) .map (func1 baru <data, data> () {@Override Public Data Call (data data) {return manipulate (data);}})) .subscribe (DATA -DATE1 <) () {@Override public void call (data data) {DOSOM NewOperator Tulis dapat digunakan untuk mencapai tujuan tidak merusak struktur tautan.
Pernyataan komposisi adalah sebagai berikut:
komposisi publik yang dapat diamati (transformator <? super t ,? memperluas transformator r>);
Parameter yang masuk adalah antarmuka transformator dan output dapat diamati. Transformer sebenarnya adalah Func1<Observable<T> , Observable<R>> , dengan kata lain: satu jenis yang dapat diamati dapat dikonversi menjadi jenis lain yang dapat diamati.
Sederhananya, komposisi dapat mengonversi asli yang dapat diamati menjadi lain yang dapat diamati melalui metode konversi yang ditentukan (transformator parameter input).
Melalui Compose, gunakan metode berikut untuk menentukan metode utas:
Private Static <T> Transformer <t, t> applySChedulers () {return New Transformer <t, t> () {@Override PUBLIC Observable <T> Panggilan (Observable <T> Observable) {return Observable.subscribeon (schedulers.io ()) .observeon (schedulers.computation ()); }}; } Observable.Fungsi tersebut menerapkancedulers dapat disederhanakan lebih lanjut menggunakan ekspresi Lambda untuk yang berikut:
private static <T> transformator <t, t> applySchedulers () {return dapat diamati-> obybyble.subscribeon (scartulers.io ()) .observeon (scartulers.computation ()); } 5. Gunakan hasil eksekusi yang berbeda sesuai prioritas
Judul di atas mungkin tidak mengungkapkan skenario yang ingin saya ungkapkan dengan jelas. Faktanya, skenario yang ingin saya ungkapkan mirip dengan skenario yang biasa untuk mendapatkan data jaringan: jika ada cache, itu akan diperoleh dari cache, dan jika tidak ada, itu akan diperoleh dari jaringan.
Di sini diperlukan bahwa jika ada cache, tindakan mendapatkan data dari jaringan tidak akan dilakukan.
Ini dapat diimplementasikan menggunakan Concat+terlebih dahulu.
Concat menggabungkan beberapa yang dapat diamati menjadi satu yang dapat diamati dan mengembalikan akhir yang dapat diamati. Dan data itu seperti dikirim dari yang dapat diamati. Parameter dapat berupa ganda yang dapat diamati atau iterator yang mengandung intionalbe.
Data dalam yang dapat diamati baru diatur dalam urutan yang dapat diamati dalam concat asli, yaitu data dalam hasil baru diurutkan dalam urutan asli.
Berikut ini adalah implementasi persyaratan di atas:
Observable.concat (getDataFromCache (), getDataFromNetwork ()). First () .subscribe (v-> System.out.println ("Hasil:"+V)); // Dapatkan data dari cache private statis statis yang dapat diamati <string> getDataFromCache () {return observable.create (s -> {// dosomething untuk mendapatkan data int nete = new random (). NextInt (); value%2; if (value! = 0) {s.onnext ("Data dari cache:"+value); s.oncompleted ();}); } // Dapatkan data dari jaringan private statis yang dapat diamati <string> getDataFromNetwork () {return Observable.create (s -> {for (int i = 0; i <10; i ++) {utils.println ("obs2 menghasilkan"+i); s.onnext ("data dari jaringan:"+i); / /generate "+i); s.onnext (" Data dari jaringan: "+i); / /Generate"+i); s.onnext ("Data dari jaringan:"+i); / /Generate oDe o); }Dalam implementasi di atas, jika getDataFromCache memiliki data, kode di sini di getDataFromNetwork tidak akan dieksekusi, yang persis seperti yang kami inginkan.
Ada beberapa implementasi di atas yang perlu diperhatikan:
1. Ada kemungkinan bahwa data tidak dapat diperoleh dari kedua tempat. Dalam skenario ini, menggunakan First akan melempar pengecualian NosuchelementException. Jika skenario ini terjadi, Anda perlu mengganti yang pertama di atas dengan Firstordefault.
2. Di getDataFromCache() di atas, jika tidak ada data, kami memanggil OnCompleted secara langsung. Jika kami tidak memanggil OnCompleted tetapi hubungi OnError, maka penggunaan CONDAT yang disebutkan di atas tidak akan mendapatkan hasil apa pun. Karena ketika CONDAT menerima kesalahan apa pun, penggabungan akan berhenti. Oleh karena itu, jika Anda ingin menggunakan OnError, Anda perlu menggunakan concatdelayerror alih -alih concat.concatDelayError ConcatDelayError akan mengabaikan kesalahan terlebih dahulu dan menunda kesalahan sampai pemrosesan akhir.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini akan membantu studi atau pekerjaan Anda. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.