
рдЖрдЬ рдХрдИ рд▓реЛрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдлрд╛рдпрджреЗ рд╣реИрдВ: рддрдерд╛рдХрдерд┐рдд "
рдХреЙрд▓рдмреИрдХ рдирд░рдХ " рдХреА рдХрдореА, рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рддрдВрддреНрд░, рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдЬреЛ рдмрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдФрд░ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди (рдХрдВрдмрд╛рдЗрди, рд╕реНрдкреНрд▓рд┐рдЯ рдФрд░ рдХрдиреНрд╡рд░реНрдЯ)ред
рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ: JVM рдХреЗ рд▓рд┐рдП RxJava, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП RxJS, iOS рдХреЗ рд▓рд┐рдП RxSwift, Rx.NET рдЖрджрд┐ред
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдХрд┐ RxKotlinред рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ RxJava2 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рддрдерд╛рдХрдерд┐рдд "рдЪреАрдиреА"ред
рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ рдРрд╕рд╛ рдЙрдкрд╛рдп рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗ:
- рдмрд╣реБ-рдордВрдЪ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБ-рдордВрдЪ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдХрдВрдкрдиреА рдХреЗ рднреАрддрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП;
- рдЕрд╢рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ - рдХреЛрдЯрд▓рд┐рди рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣рдореЗрдВ " рдЕрд░рдм рдбреЙрд▓рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ " рд╕реЗ рдмрдЪрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрд╢рдХреНрдд рдореВрд▓реНрдп рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
Observable<String?>
);
- рдХреЛрд╡рд░рд▓реАрди рдФрд░ рдХреЙрдиреНрдЯреНрд░реИрд╡рд┐рд░реНрд╕рд┐рдпрд╕ рдХреЛрдЯрд▓рд┐рди рдХреА рдПрдХ рдФрд░ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
Observable<String>
рд╕реЗ Observable<CharSequence>
рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░рдирд╛ред
рд╣рдордиреЗ рдПрдЯ рдж рдбрд┐рдб рдиреЗ рд╕рдореБрджреНрд░ рдХреЗ рдореМрд╕рдо рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рд╣рдордиреЗ рдЗрд╕реЗ Reaktive рдХрд╣рд╛ рдФрд░ рдЗрд╕реЗ
GitHub рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХреЛрдЯрд▓рд┐рди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Reaktive рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдЙрдирд╕реЗ рдХреИрд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИрдВред
рддреАрди рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░рд┐рд╕рд╛рд╡ рд▓рд╛рдн
рдмрд╣реБ
рдкрд╣рд▓рд╛
рдкреНрд░рд╛рдХреГрддрд┐рдХ рд▓рд╛рдн рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣рдорд╛рд░реЗ iOS, Android рдФрд░ рдореЛрдмрд╛рдЗрд▓ рд╡реЗрдм рдЯреАрдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореМрдЬреВрдж рд╣реИрдВред рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдбрд┐рдЬрд╛рдЗрди рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдЯреАрдо рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдХреЛрдЯрд▓рд┐рди рдЖрдкрдХреЛ рдорд▓реНрдЯреА-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдХрдВрдкрдиреА рдХреЗ рднреАрддрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдпрд╛ GitHub рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдХреА рдХреБрд▓ рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрд╢рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛
рдпрд╣ рдЬрд╛рд╡рд╛ рдФрд░ RxJava2 рдХреЗ рджреЛрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрд╢рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпреЛрдВред рдЗрд╕ рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
public interface UserDataSource { Single<User> load(); }
рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, RxJava2 рдореЗрдВ рдирд▓ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рд╡рд╣ рд╣реИ рд╢рд╛рдпрдж рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХред рд▓реЗрдХрд┐рди рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
Single<User>
рдФрд░
Single<User?>
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдФрд░ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдкреЙрдк рдЕрдк рд╣реЛрддреА рд╣реИрдВред
рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА
рдпрд╣ рдХреЛрдЯрд▓рд┐рди рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдореА рд╣реИред рдЖрдк
рдореИрдиреБрдЕрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдЯрд▓рд┐рди рдореЗрдВ RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВред
рд╕рд╣рд╕рдВрдпреЛрдЬрдХ :
fun bar(source: Observable<CharSequence>) { } fun foo(source: Observable<String>) { bar(source)
рдЪреВрдВрдХрд┐
Observable
рдПрдХ рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реНрдХреИрди рдЬреИрд╕реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреА:
fun bar(source: Observable<out CharSequence>) { source.scan { a, b -> "$a,$b" }
рд╕реНрдХреИрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рднрд┐рдиреНрди рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ "T" рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЛрдиреЛрдВ рд╣реИред рдпрджрд┐ рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдХреЛрдЯрд▓рд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдерд╛, рддреЛ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдЯреА рдХреЛ рдЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреА:
interface Observable<out T> { тАж }
рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИ:
fun bar(consumer: Consumer<String>) { } fun foo(consumer: Consumer<CharSequence>) { bar(consumer)
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг (рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп) рдХреЗ рд╕рдорд╛рди рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕реМ рдкреНрд░рддрд┐рд╢рдд рдирд╣реАрдВ:
fun bar(consumer: Consumer<in String>) { if (consumer is Subject) { val value: String = consumer.value
рдЦреИрд░, рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
interface Consumer<in T> { fun accept(value: T) }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реАрддрд╛, рд░рд┐рдХреЗрдЯрд┐рд╡ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рддреАрд╕рд░рд╛
рдкреНрд░рд╛рдХреГрддрд┐рдХ рд▓рд╛рдн рд╣реИред
рдХреЛрдЯрд▓рд┐рди + рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ = рд░рд┐рд╕рд╛рд╡
рд╣рдо рдореБрдЦреНрдп рдмрд╛рдд рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ - рд░реЗрдХрд┐рдЯрд┐рд╡ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд░реНрдгрдиред
рдЗрд╕рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдпрд╣ рдмрд╣реБ-рдордВрдЪ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЕрдВрддрддрдГ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред Badoo рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирддреЗ рд╣реИрдВред
- рдпрд╣ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИ: рдЕрд╢рдХреНрдд, рд╡рд┐рдЪрд░рдг / рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИред рдпрд╣ рд▓рдЪреАрд▓рд╛рдкрди рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- RxJava, RxSwift, рдЖрджрд┐ рдЬреИрд╕реЗ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЬрдХ рддрдХ рд▓рд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
- рд╢реБрджреНрдз рдПрдкреАрдЖрдИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Reaktive рдореЗрдВ
ObservableSource
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрд╕ Observable
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдСрдкрд░реЗрдЯрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред 15,000 рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдХреЛрдИ рднрдЧрд╡рд╛рди рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдореМрдЬреВрджрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдврд╝рд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
- рдЕрдиреБрд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди (рдкрд░рд┐рдЪрд┐рдд
subscribeOn
рдФрд░ observeOn
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
- RxJava2 (рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА) рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд, Reaktive рдФрд░ RxJava2 рдХреЗ рдмреАрдЪ рд╕реНрд░реЛрдд рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ RxJava2 рд╕реЗ рдЕрдиреБрд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- ReactiveX рдЕрдиреБрдкрд╛рд▓рдиред
рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
- рд░рд┐рдХреЗрдЯрд┐рд╡ рдореЗрдВ, рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдпрд╣рд╛рдБ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
observableOf<String>(null) //
val o1: Observable<String?> = observableOf(null)
val o2: Observable<String> = o1 // ,
val o1: Observable<String?> = observableOf(null)
val o2: Observable<String> = o1.notNull() // , null
val o1: Observable<String> = observableOf("Hello")
val o2: Observable<String?> = o1 //
val o1: Observable<String?> = observableOf(null)
val o2: Observable<String> = observableOf("Hello")
val o3: Observable<String?> = merge(o1, o2) //
val o4: Observable<String> = merge(o1, o2) // ,
рднрд┐рдиреНрдирддрд╛ рднреА рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Observable
рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ, рдЯрд╛рдЗрдк рдЯреА рдХреЛ out
рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ out
, рдЬрд┐рд╕рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
fun foo() { val source: Observable<String> = observableOf("Hello") bar(source)
рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдЬ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:- рд▓реЗрдЦрди рдХреЗ рд╕рдордп рд╕реНрдерд┐рддрд┐: рдЕрд▓реНрдлрд╛ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╕рдВрднрд╡ рд╣реИрдВ);
- рд╕рдорд░реНрдерд┐рдд рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо: рдЬреЗрд╡реАрдПрдо рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб;
- рд╕рдорд░реНрдерд┐рдд рд╕реНрд░реЛрдд:
Observable
, Maybe
, Single
рдФрд░ Completable
;
- рдХрд╛рдлреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░, рдлрд╝рд┐рд▓реНрдЯрд░, рдлрд╝реНрд▓реИрдЯрдореИрдк, рдХреЙрдиреНрдХреИрдЯрдкрд╛рдЗрдк, рдХрдореНрдмрд╛рдЗрдирдЯреЗрд╕реНрдЯ, рдЬрд╝рд┐рдк, рдорд░реНрдЬ рдФрд░ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдкреВрд░реА рд╕реВрдЪреА GitHub рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ );
- рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕рдВрдЧрдгрдирд╛, рдЖрдИрдУ, рдЯреНрд░реИрдореНрдкреЛрд▓рд┐рди рдФрд░ рдореБрдЦреНрдп;
- рд╡рд┐рд╖рдпреЛрдВ: рдкрдмреНрд▓рд┐рд╢рд╕рдмрдЬреЗрдХреНрдЯ рдФрд░ рдмрд┐рд╣реЗрд╡рд┐рдпрд░рд╕реБрдмрдЬреЗрдХреНрдЯ;
- рдмреИрдХрдкреНрд░реЗрд╢рд░ рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВред
рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдХреНрдпрд╛ рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ:- рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ Reaktive рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ (рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ);
- рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд░реНрдерди (рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд▓ рдЕрдиреБрд░реЛрдз);
- iOS рд╕рдкреЛрд░реНрдЯ
- JCenter (рд╡рд░реНрддрдорд╛рди рдореЗрдВ JitPack рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд╢рди;
- рдкреНрд░рд▓реЗрдЦрди;
- рд╕рдорд░реНрдерд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐;
- рдкрд░реАрдХреНрд╖рдг;
- рдЕрдзрд┐рдХ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ - рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЕрднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ
GitHub рдкрд░ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рдорд┐рд▓ рд╕рдХрддреА
рд╣реИ ред рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдВред рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд╣реЛрдВрдЧреЗред