Kotlin рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг



рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░рд╛ рдирд╛рдо рдЕрдирд╛рддреЛрд▓реА Varivonchik рд╣реИ, рдореИрдВ Badoo рдкрд░ рдПрдХ Android рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдЖрдЬ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╣рдХрд░реНрдореА Zsolt Kocsi рджреНрд╡рд╛рд░рд╛ MVI рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреИрдирд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рд╣реИ ред

рд╣рдо рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ


рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкреЗрд╢ рдХреАрдВ, рдЬреЛ рдПрдорд╡реАрдЖрдИрд╕реА рдХреЗ рдХреЗрдВрджреНрд░реАрдп рддрддреНрд╡ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ Reducer рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд╡реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ, рдШрдЯрдирд╛рдУрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрдкрдХрд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред

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

рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣реИ рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рд╣рдореЗрдВ рддреАрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╣реИрдВ:

  1. рдирдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдХрд┐рди рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
  2. рдЕрдкрдиреА рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?
  3. рдХреНрдпрд╛ рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдЪрдХреНрд░ рдкреНрд░рдмрдВрдзрди / рд╕реНрдкрд╖реНрдЯ рд╕рджрд╕реНрдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХреНрдпрд╛ рд╣рдо рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдШрдЯрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдФрд░ рд▓рд╛рднреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдореБрдЦреНрдп рддрддреНрд╡


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

рд╣рдордиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрддрд╛рдпрд╛:

  • рдЖрдЗрдП рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рди рдХрд░реЗрдВ - рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВред
  • рдЪреВрдБрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА RxJava рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЗрд╕рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
  • рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╕реЗ рдХрдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдордиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╕реЛрд░реНрд╕ <рдЯреА> рдФрд░ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрднреЛрдХреНрддрд╛ <рдЯреА> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдХреНрдпреЛрдВ рдирд╣реАрдВ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ / рдСрдмреНрдЬрд░реНрд╡рд░ , рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВред рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдкрдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓рд╕реНрд░реЛрд╕ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

package io.reactivex; import io.reactivex.annotations.*; /** * Represents a basic, non-backpressured {@link Observable} source base interface, * consumable via an {@link Observer}. * * @param <T> the element type * @since 2.0 */ public interface ObservableSource<T> { /** * Subscribes the given Observer to this ObservableSource instance. * @param observer the Observer, not null * @throws NullPointerException if {@code observer} is null */ void subscribe(@NonNull Observer<? super T> observer); } 

рдСрдмреНрдЬрд░реНрд╡рд░ , рдкрд╣рд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЪрд╛рд░ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рдСрдирд╕реНрдмрд╕реНрдХреНрд╕, onNext, onError рдФрд░ onCompleteред рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рд╣рдордиреЗ рдХрдВрдЬреНрдпреВрдорд░ <рдЯреА> рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА, рдЬреЛ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдП рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдордиреЗ рдСрдмреНрдЬрд░реНрд╡рд░ рдХреЛ рдЪреБрдирд╛ рд╣реИ, рддреЛ рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдХреНрд╕рд░ рдирд┐рд░рд░реНрдердХ рд╣реЛрдВрдЧреА рдпрд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░рд╛рдЬреНрдп рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рди рдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзрд╛рд░рд╛ рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)ред

 /** * A functional interface (callback) that accepts a single value. * @param <T> the value type */ public interface Consumer<T> { /** * Consume the given value. * @param t the value * @throws Exception on error */ void accept(T t) throws Exception; } 

рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдЕрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрдВрдЬреНрдпреВрдорд░ <T> рдХреЗ рдСрдмреНрдЬрд░реНрд╡рд░рд╕реЗ рд╕реЛрд░реНрд╕ <T> рдкрд░ рд╕рд╛рдЗрди рдХрд░рдХреЗ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗрд╡рд▓ рдСрдмреНрдЬрд░реНрд╡рд░ <T> рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ <T> рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЙрдкрднреЛрдХреНрддрд╛ <T> рдХреЛ рд╕рджрд╕реНрдпрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ:

 val output: ObservableSource<String> = Observable.just("item1", "item2", "item3") val input: Consumer<String> = Consumer { System.out.println(it) } val disposable = Observable.wrap(output).subscribe(input) 

(рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, .wrap (рдЖрдЙрдЯрдкреБрдЯ) рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реИ <T> )ред

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

 // Wishes -> Feature val wishes: ObservableSource<Wish> = Observable.just(Wish.SomeWish) val feature: Consumer<Wish> = SomeFeature() val disposable = Observable.wrap(wishes).subscribe(feature) // Feature -> State consumer val feature: ObservableSource<State> = SomeFeature() val logger: Consumer<State> = Consumer { System.out.println(it) } val disposable = Observable.wrap(feature).subscribe(logger) 

рдХрдВрдЬреНрдпреВрдорд░ рдФрд░ рдкреНрд░реЛрдбреНрдпреВрд╕рд░ рдХрд╛ рдпрд╣ рд▓рд┐рдВрдХрд┐рдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд╕рд░рд▓ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рднреА рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд░рджреНрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдкреЗрд╢ рд╣реИ рдмрд┐рдВрджрд░ ред

рд╕реНрдЯреЗрд░реЙрдпрдб рдмрд╛рдЗрдВрдбрд┐рдВрдЧ


MVICore рдореЗрдВ Binder рдирд╛рдордХ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ Rx рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдмреЗрд╣рддрд░реАрди рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

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

рдореИрдиреНрдпреБрдЕрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 val binder = Binder() binder.bind(wishes to feature) binder.bind(feature to logger) 

рдХреЛрдЯрд▓рд┐рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИред

рдпрджрд┐ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реИ рддреЛ рдпреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ, рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 val output: ObservableSource<A> = TODO() val input: Consumer<B> = TODO() val transformer: (A) -> B = TODO() binder.bind(output to input using transformer) 

рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдп рдХреА рддрд░рд╣ рдкрдврд╝рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рдПрдХ рдЕрдиреНрдп рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХреЛрдЯрд▓рд┐рди рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ)ред рд▓реЗрдХрд┐рди рдмрд╛рдЗрдВрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╡рд╛рдХреНрдпрдЧрдд рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

рдмрд╛рдЗрдВрдбрд░ рдмрдирд╛рдПрдБ


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдХрд╣реАрдВ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ:

 val binder = Binder() 

рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЬрдм рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ binder.dispose() рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ: рдЬреАрд╡рдирдЪрдХреНрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣:

 val binder = Binder(lifecycle) 

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

рдФрд░ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреНрдпрд╛ рд╣реИ?


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

рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ Android рдЗрдВрдЯрд░рдлрд╝реЗрд╕ LifecycleOwner рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдмрд╛рдЗрдВрдбрд░ рдХрд╛ рдЕрдкрдирд╛, рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ BEGIN / END рд╕рд┐рдЧреНрдирд▓ рд╕реНрдЯреНрд░реАрдо рд╣реИ:

 interface Lifecycle : ObservableSource<Lifecycle.Event> { enum class Event { BEGIN, END } // Remainder omitted } 

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

рдмрд╛рдЗрдВрдбрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? BEGIN рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдШрдЯрдХреЛрдВ ( рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ ) рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ END рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ, рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 val output: PublishSubject<String> = PublishSubject.create() val input: Consumer<String> = Consumer { System.out.println(it) } val lifecycle = ManualLifecycle() val binder = Binder(lifecycle) binder.bind(output to input) output.onNext("1") lifecycle.begin() output.onNext("2") output.onNext("3") lifecycle.end() output.onNext("4") lifecycle.begin() output.onNext("5") output.onNext("6") lifecycle.end() output.onNext("7") // will print: // 2 // 3 // 5 // 6 

рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд░реАрд╕рд╛рдЗрдирд┐рдВрдЧ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдореЗрдВ рдпрд╣ рд▓рдЪреАрд▓рд╛рдкрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрдм рд╕рд╛рдорд╛рдиреНрдп рдХреНрд░рд┐рдПрдЯ-рдирд╖реНрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрдИ рд╕реНрдЯрд╛рд░реНрдЯ-рд╕реНрдЯреЙрдк рдФрд░ рд░рд┐рдЬреНрдпреВрдореЗ-рдкреЙрдЬрд╝ рд╕рд╛рдЗрдХрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдВрдбреНрд░реЙрдЗрдб рдмрд╛рдЗрдВрдбрд░ рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓


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

  • CreateDestroyBinderLifecycle ( AndroidLifecycle )
  • StartStopBinderLifecycle ( AndroidLifecycle )
  • ResumePauseBinderLifecycl e ( androidLifecycle )

androidLifecycle , getLifecycle() рд╡рд┐рдзрд┐, getLifecycle() , getLifecycle() , рдЖрджрд┐ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣реИред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

 fun createBinderForActivity(activity: AppCompatActivity) = Binder(   CreateDestroyBinderLifecycle(activity.lifecycle) ) 

рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЬреАрд╡рди рдЪрдХреНрд░


рдЪрд▓реЛ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд░реБрдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВред рдмрд╛рдЗрдВрдбрд░ рдХрд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреНрдпрд╛ рд╣реИ? рд╡рд╕реНрддреБрддрдГ рдХреБрдЫ рднреА: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрд╡рд╛рдж рдХрд╛ рдкреНрд▓реЗрдмреИрдХ рд╕рдордп рдпрд╛ рдХреБрдЫ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордпред рдЖрдк рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ DI рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдмрд╛рдБрдз рд▓реЗрдВ - рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рд╕рджрд╕реНрдпрддрд╛ рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдЧреАред рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдкреВрд░реНрдг рд╕реНрд╡рддрдВрддреНрд░рддрд╛ред

  1. рдСрдмреНрдЬрд╝рд░реНрд╡рдмрд▓ рдЖрдЗрдЯрдо рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рджрд╕реНрдпрддрд╛ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЬреАрд╡рдирдЪрдХреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрд╛рдЗрдВрдбрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

     fun Observable<T>.toBinderLifecycle() = Lifecycle.wrap(this   .first()   .map { END }   .startWith(BEGIN) ) 
  2. рдЕрдкрдиреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рддрдм рддрдХ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрдВрдкреНрд▓реАрдЯрдПрдмрд▓ рдЦрддреНрдо рди рд╣реЛ рдЬрд╛рдП? рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

     fun Completable.toBinderLifecycle() = Lifecycle.wrap(   Observable.concat(       Observable.just(BEGIN),       this.andThen(Observable.just(END))   ) ) 
  3. рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рдЧреИрд░-рдЖрд░рдПрдХреНрд╕ рдХреЛрдб рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдореИрдиреНрдпреБрдЕрд▓рд▓рд┐рдлрд╝рд╕рд╛рдЗрдХрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдпрд╛ рддреЛ Lifecycle рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╕реНрдЯреНрд░реАрдо рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рддрддреНрд╡ рд╕реНрдЯреНрд░реАрдо, рдпрд╛ рдпрджрд┐ рдЖрдк рдЧреИрд░-Rx рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ ManualLifecycle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдгрд╛рд▓реА рдЕрд╡рд▓реЛрдХрди


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

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХ рд╣реИрдВ:



рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдШрдЯрдХ рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реАрди рдХреЗ рднреАрддрд░ рдЬреБрдбрд╝реЗ рд╣реЛрдВ, рдФрд░ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐:

  • Analytics рдХреЛ рд╕реАрдзреЗ UIEvent рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  • UIEvent рдХреЛ рдлреАрдЪрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢ рдореЗрдВ рддрдмреНрджреАрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  • рд░рд╛рдЬреНрдп рдХреЛ рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП ViewModel рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдХреБрдЫ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 with(binder) {   bind(feature to view using stateToViewModelTransformer)   bind(view to feature using uiEventToWishTransformer)   bind(view to analyticsTracker) } 

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

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


рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ Binder Rx рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХреЛрдВ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

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

рдЗрд╕ рдмреАрдЪ, GitHub рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреЗрдЦреЗрдВред

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


All Articles