RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Android рдореЗрдВ рддрддреНрдХрд╛рд▓ рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛

RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Android рдореЗрдВ рддрддреНрдХрд╛рд▓ рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛


рдореИрдВ рдПрдХ рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХреЗрдВрдб рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдПрдХ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░реВрдБрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд╛рда рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рд╕рд╣реА рд╣реЛрдЧреАред


рддреБрд░рдВрдд рдЦреЛрдЬ


рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдкреГрд╖реНрда рдкрд░ рдЦреЛрдЬ рдШрдЯрдХ рдХреЛ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЯреВрд▓рдмрд╛рд░ рдореЗрдВ), onTextChange рдШрдЯрдирд╛ onTextChange рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЦреЛрдЬ рдХрд░реЗрдВред рддреЛ рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛:


 override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_main, menu) val searchView = menu?.findItem(R.id.action_search)?.actionView as SearchView // Set up the query listener that executes the search searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { Log.d(TAG, "onQueryTextSubmit: $query") return false } override fun onQueryTextChange(newText: String?): Boolean { Log.d(TAG, "onQueryTextChange: $newText") return false } }) return super.onCreateOptionsMenu(menu) } 

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рдореБрдЭреЗ рдЗрдирдкреБрдЯ рдХреЗ рд╕рдордп рдкрд░ рдПрдХ рдЦреЛрдЬ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдм рднреА рдПрдХ onQueryTextChange() рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреА onQueryTextChange() , рдореИрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкрд╣рд▓рд╛ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреА рдУрд░ рдореБрдбрд╝рддрд╛ рд╣реВрдВред рд▓реЙрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:


 D/MainActivity: onQueryTextChange: T D/MainActivity: onQueryTextChange: TE D/MainActivity: onQueryTextChange: TES D/MainActivity: onQueryTextChange: TEST D/MainActivity: onQueryTextSubmit: TEST 

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдЕрдкрдиреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдкрд╛рдВрдЪ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЙрдб рдореЗрдВ, рдЖрдкрдХреЛ API рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдореИрдВ рдЕрдкрдирд╛ рдЕрдиреБрд░реЛрдз рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдереЛрдбрд╝реА рджреЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрд╛рдХрд┐ рдЕрдВрдд рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред


рдЕрдм, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдХреБрдЫ рдФрд░ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд╣рдЯрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдиреНрдп рд╡рд░реНрдг рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реВрдВ:


 D/MainActivity: onQueryTextChange: TES D/MainActivity: onQueryTextChange: TE D/MainActivity: onQueryTextChange: T D/MainActivity: onQueryTextChange: D/MainActivity: onQueryTextChange: S D/MainActivity: onQueryTextChange: SO D/MainActivity: onQueryTextChange: SOM D/MainActivity: onQueryTextChange: SOME D/MainActivity: onQueryTextChange: SOMET D/MainActivity: onQueryTextChange: SOMETH D/MainActivity: onQueryTextChange: SOMETHI D/MainActivity: onQueryTextChange: SOMETHIN D/MainActivity: onQueryTextChange: SOMETHING D/MainActivity: onQueryTextChange: SOMETHING D/MainActivity: onQueryTextChange: SOMETHING E D/MainActivity: onQueryTextChange: SOMETHING EL D/MainActivity: onQueryTextChange: SOMETHING ELS D/MainActivity: onQueryTextChange: SOMETHING ELSE D/MainActivity: onQueryTextChange: SOMETHING ELSE D/MainActivity: onQueryTextSubmit: SOMETHING ELSE 

20 рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╣реИрдВ! рдереЛрдбрд╝реА рджреЗрд░реА рд╕реЗ рдЗрди рдХреЙрд▓реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред рдореИрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдлрд╕рд▓реА рдкрд╛рда рджреЛрд╣рд░рд╛рдП рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рди рд╣реЛред рдореИрдВ рднреА рд╢рд╛рдпрдж рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдП рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рдпрд╛ рдПрдХ рд╡рд░реНрдг рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?


рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдореИрдВ рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдЖрд░рдПрдХреНрд╕рдЬрд╛рд╡ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЖрдпрд╛, рддреЛ рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╡рд░рдг рджреЗрдЦрд╛:


ReactiveX рдПрдХ рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬрд░реНрд╡рд░ рдФрд░ рдЗрдЯрд░реЗрдЯрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдпрд╛ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ ReactiveX рдХреА рдкреНрд░рдХреГрддрд┐ рдФрд░ рд╢рдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╕рдордЭрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд╛рд░реНрдЯ рднреА рджреЗрдЦреЗ:


рджреЗрд░реА рдСрдкрд░реЗрдЯрд░ рдЪрд╛рд░реНрдЯ


рдЖрд░реЗрдЦ рдСрдкрд░реЗрдЯрд░ рдХреА рднреВрдорд┐рдХрд╛ рдХреЛ рд╕рдордЭрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИред рддреЛ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдЖрд░реЗрдЦ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реВрдВред


рдЖрдЗрдП рдкрд╣рд▓реЗ рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреА build.gradle рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдирдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


 implementation "io.reactivex.rxjava2:rxjava:2.1.14" 

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рд┐рдВрдХ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред


рдЕрдм рд╣рдо рдПрдХ рдирдпрд╛ рд╕рдорд╛рдзрд╛рди рджреЗрдЦрддреЗ рд╣реИрдВред рдкреБрд░рд╛рдиреА рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдЪрд░рд┐рддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реА рдПрдкреАрдЖрдИ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ред рдирдИ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдПрдХ Observable рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ:


 override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_main, menu) val searchView = menu?.findItem(R.id.action_search)?.actionView as SearchView // Set up the query listener that executes the search Observable.create(ObservableOnSubscribe<String> { subscriber -> searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextChange(newText: String?): Boolean { subscriber.onNext(newText!!) return false } override fun onQueryTextSubmit(query: String?): Boolean { subscriber.onNext(query!!) return false } }) }) .subscribe { text -> Log.d(TAG, "subscriber: $text") } return super.onCreateOptionsMenu(menu) } 

рдпрд╣ рдХреЛрдб рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЙрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:


 D/MainActivity: subscriber: T D/MainActivity: subscriber: TE D/MainActivity: subscriber: TES D/MainActivity: subscriber: TEST D/MainActivity: subscriber: TEST 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирдИ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдзрд╛рд░рд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИ - Observable ред рдкрд╛рда рд╣реИрдВрдбрд▓рд░ (рдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз) рддрддреНрд╡реЛрдВ рдХреЛ onNext() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред рдФрд░ Observable рдХреЗ рд╕рджрд╕реНрдп рд╣реИрдВ рдЬреЛ рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рддрд╛рд░ рдХреА рд╕реВрдЪреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднреЗрдЬрд╛ рдЧрдпрд╛ рдкрд╛рда рд╣рдореЗрд╢рд╛ рдирд┐рдЪрд▓рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрдВрдХреНрддрд┐ рдХреЗ рдЖрд░рдВрдн рдФрд░ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛:


 Observable.create(ObservableOnSubscribe<String> { ... }) .map { text -> text.toLowerCase().trim() } .subscribe { text -> Log.d(TAG, "subscriber: $text" } 

рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдореЗрдВ рдХрдЯреМрддреА рдХреАред рдЕрдм рд╡рд╣реА рд▓реЙрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:


 D/MainActivity: subscriber: t D/MainActivity: subscriber: te D/MainActivity: subscriber: tes D/MainActivity: subscriber: test D/MainActivity: subscriber: test 

рдЕрдм рдЕрдзрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП, 250ms рдХреА рджреЗрд░реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ:


 Observable.create(ObservableOnSubscribe<String> { ... }) .map { text -> text.toLowerCase().trim() } .debounce(250, TimeUnit.MILLISECONDS) .subscribe { text -> Log.d(TAG, "subscriber: $text" } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдЕрдиреВрдард╛ рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛред рдмрд╛рдж рдХреЗ рд╕рдорд╛рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


 Observable.create(ObservableOnSubscribe<String> { ... }) .map { text -> text.toLowerCase().trim() } .debounce(100, TimeUnit.MILLISECONDS) .distinct() .subscribe { text -> Log.d(TAG, "subscriber: $text" } 

рд▓рдЧрднрдЧред рдЯреНрд░рд╛рдВрд╕ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ distinctUntilChanged() рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛, рдХрд┐рд╕реА рднреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рдмрд╛рд░-рдмрд╛рд░ рдЦреЛрдЬ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд╡реЗрд░реА рдХреЛ рдХреЗрд╡рд▓ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рд╕рдлрд▓ рдЕрдиреБрд░реЛрдз рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдФрд░ рдирдП рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдпрджрд┐ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЦрд╛рд▓реА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ:


 Observable.create(ObservableOnSubscribe<String> { ... }) .map { text -> text.toLowerCase().trim() } .debounce(100, TimeUnit.MILLISECONDS) .distinct() .filter { text -> text.isNotBlank() } .subscribe { text -> Log.d(TAG, "subscriber: $text" } 

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд▓реЙрдЧ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ (рдпрд╛ рд╢рд╛рдпрдж рджреЛ) рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрдо рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд╡реЗрджрди рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрдм рдЖрдк рдХреБрдЫ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдкреАрдЖрдИ рдореЗрдВ рдХрдо рдХреЙрд▓ рдЖрдПрдВрдЧреЗред


рдХрдИ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ рдЬреЛ рдЖрдк рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡реЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдкреВрд░рд╛ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


 // Set up the query listener that executes the search Observable.create(ObservableOnSubscribe<String> { subscriber -> searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextChange(newText: String?): Boolean { subscriber.onNext(newText!!) return false } override fun onQueryTextSubmit(query: String?): Boolean { subscriber.onNext(query!!) return false } }) }) .map { text -> text.toLowerCase().trim() } .debounce(250, TimeUnit.MILLISECONDS) .distinct() .filter { text -> text.isNotBlank() } .subscribe { text -> Log.d(TAG, "subscriber: $text") } 

рдЕрдм рдореИрдВ рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ViewModel рдХреЛ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдЖрд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рдСрдмреНрдЬрд░реНрд╡рдмрд▓ рдореЗрдВ рдкрд╛рда рддрддреНрд╡реЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдФрд░ RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд░рд▓ рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде, рдЖрдк рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЬрд╡рд╛рдмрджреЗрд╣реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ RxJava рдХреА рдкреВрд░реА рджреБрдирд┐рдпрд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ:


  • рдбреИрди рд▓реНрдпреВ рдЧреНрд░реЙрдХрд┐рдВрдЧ RxJava (рдпрд╣ рд╡рд╣ рд╕рд╛рдЗрдЯ рд╣реИ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдореЗрдВ рдорджрдж рдХреА)ред
  • ReactiveX рд╕рд╛рдЗрдЯ (рдореИрдВ рдЕрдХреНрд╕рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╕рд╛рдЗрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ)ред

Source: https://habr.com/ru/post/hi430394/


All Articles