โครงสร้างพื้นฐาน
ก่อนอื่นให้ดูที่รหัสพื้นฐานที่สุดและวิเคราะห์วิธีการใช้รหัสนี้ใน RXJAVA
Observable.onsubscribe <string> onsubscribe1 = new Observable.onsubscribe <string> () {@Override โมฆะสาธารณะการโทร (สมาชิก <? super string> สมาชิก) {subscriber.onnext ("1"); สมาชิก. oncompleted (); - สมาชิก <String> สมาชิก 1 = สมาชิกใหม่ <String> () {@Override โมฆะสาธารณะ onCompleTed () {} @Override โมฆะสาธารณะ onerror (throwable e) {} @Override void สาธารณะ onNext (สตริง s) {}};ก่อนอื่นมาดูรหัสที่สังเกตได้สร้าง
สาธารณะคงที่สุดท้าย <t> สังเกตได้ <t> สร้าง (onsubscribe <t> f) {ส่งคืนใหม่ที่สังเกตได้ <t> (hook.oncreate (f));} การป้องกันที่สังเกตได้ (onsubscribe <t> f) มันเรียกตัวสร้างโดยตรงที่สังเกตได้เพื่อสร้างวัตถุที่สังเกตได้ใหม่ เราทำเครื่องหมายวัตถุนี้ชั่วคราวว่าสามารถสังเกตได้ 1 สำหรับการตรวจสอบย้อนกลับในภายหลัง
ในเวลาเดียวกันวัตถุ OnSubscribe ที่เราส่งผ่านจะถูกบันทึกไว้ในคุณสมบัติ OnSubscribe ของที่สังเกตได้ 1 คุณสมบัตินี้มีความสำคัญมากในบริบทที่ตามมาโปรดให้ความสนใจ
ถัดไปมาดูวิธีการสมัครสมาชิก
การสมัครสมาชิกครั้งสุดท้ายสมัครสมาชิก (สมาชิก <? super t> สมาชิก) {return observable.subscribe (สมาชิก, สิ่งนี้);} ส่วนตัวคงที่ <t> การสมัครสมาชิกสมัครสมาชิก (สมาชิก <? hook.onsubscribestart (สังเกตได้, สังเกตได้ return hook.onsubscribereturn (สมาชิก);} อย่างที่คุณเห็นหลังจากสมัครสมาชิกวิธีการที่สังเกตได้ 1.onsubscribe.call เรียกว่าโดยตรงซึ่งเป็นวิธีการโทรของวัตถุ OnSubscribe1 ในรหัสของเรา พารามิเตอร์ที่ผ่านเป็นวัตถุสมาชิกที่กำหนดไว้ในรหัสของเรา สิ่งที่ทำในวิธีการโทรคือการเรียกใช้วิธี onnext และ oncomplete ของวัตถุผู้สมัครสมาชิกที่เข้ามา
สิ่งนี้ช่วยให้การสื่อสารระหว่างผู้สังเกตการณ์และผู้สังเกตการณ์ มันไม่ง่ายมากเหรอ?
การเรียกโมฆะสาธารณะ (สมาชิก <? Super String> สมาชิก) {subscriber.onnext ("1"); subscriber.oncompleted ();}สรุปสถานการณ์การใช้งาน RXJAVA
1. ตรวจสอบสถานการณ์ที่แคชก่อน
รับข้อมูลก่อนอื่นตรวจสอบว่ามีแคชในหน่วยความจำแล้วตรวจสอบว่ามีเงื่อนไขก่อนหน้านี้ในแคชไฟล์หรือไม่และในที่สุดเงื่อนไขต่อไปนี้จะได้รับความพึงพอใจจากเครือข่ายหรือไม่
สุดท้ายที่สังเกตได้ <string> memory = deploverable.create (new Observable.onsubscribe <String> () {@Override การเรียกโมฆะสาธารณะ (สมาชิก <? Super String> สมาชิก) {ถ้า (MemoryCache! = null) {subscriber.onnext (MemoryCache); Absoverable.create (ใหม่ที่สังเกตได้ onsubscribe <string> () {@Override การเรียกโมฆะสาธารณะ (สมาชิก <? super string> สมาชิก) {สตริง cachepref = rxpreferences.getString ("cache") get (); if (! textutils.isempty สมาชิก. oncompleted ();}}}); สามารถสังเกตได้ <string> network = neverbable.just ("Network"); // สิ่งสำคัญคือต้องพึ่งพาตัวดำเนินการ CONCAT เพื่อใช้งานที่สังเกตได้ concat (หน่วยความจำ, ดิสก์, เครือข่าย). first (). subscribeon (schedulers.newthread ();2. อินเทอร์เฟซต้องรอจนกว่าอินเทอร์เฟซหลายตัวจะรวบรวมข้อมูลพร้อมกันก่อนที่จะอัปเดต
// แยกเอาต์พุตของสองสิ่งที่สังเกตได้และไม่รับประกันคำสั่งซื้อ ส่งไปยังสมาชิกในลำดับเหตุการณ์โมฆะส่วนตัว testmerge () {สังเกตได้ <string> ที่สังเกตได้ 1 = demoutils.createobservable1 (). subcribeon (schedulers.newthread ()); สังเกตได้ <string> ที่สังเกตได้ 2 = demoutils.createobservable2 (). subcribeon (schedulers.newthread ()); สังเกตได้. เมอร์จ (สังเกตได้ 1, สังเกตได้ 2) .subscribeon (schedulers.newthread ()) .subscribe (System.out :: println);}3. คำขอของอินเทอร์เฟซหนึ่งขึ้นอยู่กับข้อมูลที่ส่งคืนโดยคำขอ API อื่น
ตัวอย่างเช่นหลังจากเราจำเป็นต้องเข้าสู่ระบบเรามักจะได้รับรายการข้อความตามโทเค็นที่เราได้รับ
ที่นี่ Rxjava ใช้เพื่อแก้ปัญหาการโทรกลับซ้อนกัน มีคำนามที่เหมาะสมที่เรียกว่าการโทรกลับนรก
Networkservice.getToken ("ชื่อผู้ใช้", "รหัสผ่าน") .flatmap (s -> networkservice.getMessage (s)) .subscribe (s -> {system.out.println ("ข้อความ:" + s);});4. ปุ่มอินเตอร์เฟสต้องป้องกันการคลิกอย่างต่อเนื่อง
rxview.clicks (findViewById (r.id.btn_throttle)). Throttlefirst (1, TimeUnit.seconds) .subscribe (หลีกเลี่ยง -> {system.out.println ("คลิก");});5. อินเทอร์เฟซตอบสนอง
ตัวอย่างเช่นช่องทำเครื่องหมายจะถูกตรวจสอบและการตั้งค่าที่สอดคล้องกันจะได้รับการอัปเดตโดยอัตโนมัติ
SharedPreferences Preferences = PreferenCeManager.getDefaultSharedPreferences (นี่); rxsharedPreferences rxpreferences = rxsharedPreferences.create (การตั้งค่า); การตั้งค่า <บูลีน> checked = rxpreferences.getBoolean findViewById (r.id.cb_test); rxCompoundButton.CheckedChanges (ช่องทำเครื่องหมาย) .subscribe (checked.asaction ());
6. การแปลงข้อมูลที่ซับซ้อน
สังเกตได้เพียงแค่ ("1", "2", "2", "3", "4", "5") .map (จำนวนเต็ม :: parseint) .filter (s -> s> 1) .distinct (). .subscribe (System.out :: println); // 9