ActionViews рдпрд╛ рдореБрдЭреЗ рдмрдЪрдкрди рд╕реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреИрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рджреГрд╢реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рддрдВрддреНрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: ContentView, LoadingView, NoInternetView, EmptyContentView, ErrorViewред





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


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


ActionViews


рдореЗрд░реЗ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдХрд╣рд╛ рдХрд┐ рджреГрд╢реНрдп рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рднреА рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдФрд░ рдХрд░ рджрд┐рдпрд╛ред


рдорд╛рдирдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдХреНрд░реАрди, рдЬрд┐рд╕рдХрд╛ рдбреЗрдЯрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕реЗ рдХрдо рд╕реЗ рдХрдо 5 рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


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

рддрджрдиреБрд╕рд╛рд░, рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рджреГрд╢реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдореИрдВ рдЗрди View - ActionViews рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ , рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХрдм рдЫрд┐рдкрд╛рдирд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдПрдХреНрд╢рди рд╡реНрдпреВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдРрд╕реЗ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ (рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдирд╣реАрдВ) рд╣реИред


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


public void getSomeData(LoadingView loadingView, ErrorView errorView, NoInternetView noInternetView, EmptyContentView emptyContentView) { mApi.getProjects() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnSubscribe(disposable -> { loadingView.show(); noInternetView.hide(); emptyContentView.hide(); }) .doFinally(loadingView::hide) .flatMap(projectResponse -> { /*    */ }) .subscribe( response -> {/*   */}, throwable -> { if (ApiUtils.NETWORK_EXCEPTIONS .contains(throwable.getClass())) noInternetView.show(); else errorView.show(throwable.getMessage()); } ); } 

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


рд╕реНрддрд░ рдКрдкрд░


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


рдЕрдм рд╣рдорд╛рд░рд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 public void getSomeData(LoadingView loadingView, ErrorView errorView, NoInternetView noInternetView, EmptyContentView emptyContentView) { mApi.getProjects() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .compose(RxUtil::loading(loadingView)) .compose(RxUtil::emptyContent(emptyContentView)) .compose(RxUtil::noInternet(errorView, noInternetView)) .subscribe(response -> { /*   */ }, RxUtil::error(errorView)); } 

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


рдирд┐рд░реНрдгрд╛рдпрдХ рдмрд┐рдВрджреБ


рддрдВрддреНрд░ рдХреЗ рдХрдИ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЖрдпрд╛:


 public void getSomeData() { execute(() -> mApi.getProjects(), new BaseSubscriber<>(response -> { /*   */ })); } 

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рддрдВрддреНрд░ рдХреЛ рд▓рдЧрднрдЧ 10-15 рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛, рдФрд░ рд╣рд░ рдмрд╛рд░ рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдерд╛ред рдореИрдВ рдЖрдкрдХреЛ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЪрд▓реЛ рджреЛ рдЕрдВрддрд┐рдо рд▓реЛрдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВред рдкрд╣рд▓реЗ рддреБрдо рд╕рд┐рд░реНрдл рджреЗрдЦрддреЗ рдереЗред


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





рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдФрд░ рдХрдард┐рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рдХрд╛рдлреА рдЧрдВрднреАрд░ рдиреБрдХрд╕рд╛рди рдФрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдереАрдВ:


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

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


рдЕрд▓рд╡рд┐рджрд╛ рдЬрд╛рд╡рд╛!


рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдореИрдВ рдШрд░ рдкрд░ рдмреИрдард╛ рдерд╛, рдореЗрдВ рджрдмреЛрдЪрд╛ рдореИрдВ рдЪрд╛рд░реЛрдВ рдУрд░ рдмреЗрд╡рдХреВрдл рдмрдирд╛ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЕрдЪрд╛рдирдХ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореБрдЭреЗ рдХреЛрдЯрд▓рд┐рди рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди, рд▓рдВрдмреЛрджрд╛ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдереАред


рдкрд╣рд▓реЗ рддреЛ рд╡рд╣ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рджрд┐рдЦреЗред рд▓реЗрдХрд┐рди рдЕрдм рд╡рд╣ рд▓рдЧрднрдЧ рд╕рднреА рдХрдорд┐рдпреЛрдВ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдкрд┐рдЫрд▓рд╛ рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ:


 fun getSomeData() { api.getProjects() .withActionViews(view) .execute(onComplete = { /*   */ }) } 

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


 fun getSomeData() { api.getProjects() .withActionViews( view, doOnLoadStart = { /* */ }, doOnLoadEnd = { /* */ }) .execute(onComplete = { /*   */ }) } 

рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдиреНрдп ActionViews рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдпрджрд┐ рдЖрдк рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ ActionViews рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рджреГрд╢реНрдп рдХреЛ рд╣рдорд╛рд░реЗ ActionView рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:


 fun getSomeData(projectLoadingView: LoadingView) { mApi.getPosts(1, 1) .withActionViews( view, loadingView = projectLoadingView ) .execute(onComplete = { /*   */ }) } 

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


 class SwipeRefreshLayout : android.support.v4.widget.SwipeRefreshLayout, LoadingView { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) } 

рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВ рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХрддреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╕реБрдЭрд╛рд╡ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред CustomViews рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдореБрдЦреНрдп рдХрд╛рд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ ActionView рд╣реИред рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк рджреЗрдЦреЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЛ withActionsViews рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп рдЧрд▓рддреА рд╕реЗ рдЧрд▓рддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ withActionsViews рд╡рд┐рдзрд┐ рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ:


 fun <T> Observable<T>.withActionViews( view: ActionsView, contentView: View = view.contentActionView, loadingView: LoadingView? = view.loadingActionView, noInternetView: NoInternetView? = view.noInternetActionView, emptyContentView: EmptyContentView? = view.emptyContentActionView, errorView: ErrorView = view.errorActionView, doOnLoadStart: () -> Unit = { doOnLoadSubscribe(contentView, loadingView) }, doOnLoadEnd: () -> Unit = { doOnLoadComplete(contentView, loadingView) }, doOnStartNoInternet: () -> Unit = { doOnNoInternetSubscribe(contentView, noInternetView) }, doOnNoInternet: (Throwable) -> Unit = { doOnNoInternet(contentView, errorView, noInternetView) }, doOnStartEmptyContent: () -> Unit = { doOnEmptyContentSubscribe(contentView, emptyContentView) }, doOnEmptyContent: () -> Unit = { doOnEmptyContent(contentView, errorView, emptyContentView) }, doOnError: (Throwable) -> Unit = { doOnError(errorView, it) } ) { /**/ } 

рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддреЗрдЬ! рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдпрд╣ loadingView рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: LoadingView? .. рдпрд╣ рд╣рдореЗрдВ ActionView рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


рддрджрдиреБрд╕рд╛рд░, рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд░рд▓ рдХрджрдо рдЙрдард╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • рд╣рдорд╛рд░реЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рд╣рдорд╛рд░реЗ ActionViews, рдЬреЛ рдХрд╕реНрдЯрдо рд╣реИрдВред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдмрдирд╛рдпреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • HasActionsView рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдХреЛрдб рдореЗрдВ ActionViews рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:
     override var contentActionView: View by mutableLazy { recyclerView } override var loadingActionView: LoadingView? by mutableLazy { swipeRefreshLayout } override var noInternetActionView: NoInternetView? by mutableLazy { noInternetView } override var emptyContentActionView: EmptyContentView? by mutableLazy { emptyContentView } override var errorActionView: ErrorView by mutableLazy { ToastView(baseActivity) } 
  • рдпрд╛ рдЙрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдХреНрд╢рди рд╡реНрдпреВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдХрдбрд╝рд╛рдИ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


     abstract class ActionsFragment : Fragment(), HasActionsView { override var contentActionView: View by mutableLazy { findViewById<View>(R.id.contentView) } override var loadingActionView: LoadingView? by mutableLazy { findViewByIdNullable<View>(R.id.loadingView) as LoadingView? } override var noInternetActionView: NoInternetView? by mutableLazy { findViewByIdNullable<View>(R.id.noInternetView) as NoInternetView? } override var emptyContentActionView: EmptyContentView? by mutableLazy { findViewByIdNullable<View>(R.id.emptyContentView) as EmptyContentView? } override var errorActionView: ErrorView by mutableLazy { ToastView(baseActivity) } } 

  • рдПрдХ рдмреЙрдпрд▓рд░ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ!

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


 import kotlinx.android.synthetic.main.fr_gifts.contentView as recyclerView 

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


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


рдЬрдмрдХрд┐ рдореИрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛ ...


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



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


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


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


PPS ActionViews рдХреЛ рдкреВрд░реНрдг-рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдпрд╛, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░реЗрдВ рдпрд╛ рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрджрд▓ рджреЗрдВред


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

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


All Articles