рдбреЗрдЧрд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдЪрдп

http://radiant--eclipse.deviantart.com/
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ (рдФрд░ рди рдХреЗрд╡рд▓) рдмрдврд╝рддреЗ рдУрдкрди рд╕реЛрд░реНрд╕ рд▓реИрдЧрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
рддреЛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИ? рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рдХреЛ рдЫреЛрдЯреЗ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрди рд╕рдорд╛рди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

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

рдЯреНрд╡рд┐рдЯрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдПрдХ рд╕рд░рд▓реАрдХреГрдд (рдЫрджреНрдо рдХреЛрдб рддрдХ) рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЖрд░реЗрдЦ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

public class Tweeter { public void tweet(String tweet) { TwitterApi api = new TwitterApi(); api.postTweet("Test User", tweet); } } public class TwitterApi { public void postTweet(String user, String tweet) { HttpClient client = new OkHttpClient(); HttpUrlConnection connection = client.open("...."); /* post tweet */ } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╕реЗрдЯ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 Tweeter tweeter = new Tweeter(); tweeter.tweet("Hello world!"); 


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

 public class Tweeter { private TwitterApi api; public Tweeter(HttpClient httpClient) { this.api = new TwitterApi(httpClient); } public void tweet(String tweet) { api.postTweet("Test User", tweet); } } public class TwitterApi { private HttpClient client; public TwitterApi(HttpClient client) { this.client = client; } public void postTweet(String user, String tweet) { HttpUrlConnection connection = client.open("...."); /* post tweet */ } } 


рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг Http рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ "рд╕реНрдерд╛рдирд╛рдкрдиреНрди" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛:
 Tweeter tweeter = new Tweeter(new MockHttpClient); tweeter.tweet("Hello world!"); 


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рдЕрдм "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ "рд▓реЗрдХрд┐рди" рд╣реИ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯрд╛рдЗрдорд▓рд╛рдЗрди рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо n рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ TwitterApi рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:



 Timeline timeline = new Timeline(new OkHttpClient(), "Test User"); timeline.loadMore(20); for(Tweet tweet: timeline.get()) { System.out.println(tweet); } 


рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

 public class Timeline { String user; TweeterApi api; public Timeline(HttpClient httpClient, String user) { this.user = user; this.api = new TweeterApi(httpClient); } public void loadMore(int n){/*.....*/} public List<Tweet> get(){/*.......*/} } 


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

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдЯрд╛рд░



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

рдбреИрдЧрд░ рдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн (рд╕рдорд╛рди рдЧрд╛рдЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ):


рдбреИрдЧрд░ рдореЗрдВ, рдирд┐рд░реНрднрд░рддрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ 3 рдмрдбрд╝реЗ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ:


рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ


@Inject рдХреЛ рдХрд┐рд╕реА рдПрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ @Inject рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 @Inject private HttpClient client; 


... рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ)

рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ


рдбреИрдЧрд░ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ "рдореЙрдбреНрдпреВрд▓" рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдиреЛрдЯреЗрдЯ @Module рд╡рд░реНрдЧ:

 @Module public class NetworkModule{...} 


рдпрд╣ рд╡рд░реНрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХреА рдЧрдИ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ "рд╕рдВрддреЛрд╖рдЬрдирдХ" рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рдЖрдкрдХреЛ рддрдерд╛рдХрдерд┐рдд "рдкреНрд░рджрд╛рддрд╛" рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ HttpClient рдЙрджрд╛рд╣рд░рдг (рдПрдиреЛрдЯреЗрдЯ @Provide ) @Provide :

 @Module(injects=TwitterApi.class) public class NetworkModule { @Provides @Singleton HttpClient provideHttpClient() { return new OkHttpClient(); } } 


рд╣рдордиреЗ рдбреИрдЧрд░ рдХреЛ рдмрддрд╛рдпрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ @ @Inject рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ HttpClient рдХреЗ рд▓рд┐рдП рдкреВрдЫрдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП OkHttpClient рдмрдирд╛рдпрд╛

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрди рд╕рднреА рд╡рд░реНрдЧреЛрдВ (рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдкреВрдЫрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, HttpClient рдХреЗрд╡рд▓ TwitterApi рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
@Singleton рдбреИрдЧрд░ рдХреЛ рдХреЗрд╡рд▓ 1 рдЧреНрд░рд╛рд╣рдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред

рд░рдЪрдирд╛ рдХреА рдЧрд┐рдирддреА


рдЕрдм рдЧреНрд░рд╛рдл рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Injector рдХреНрд▓рд╛рд╕ рдмрдирд╛рдпрд╛, рдЬреЛ рдПрдХ (рдпрд╛ рдЕрдзрд┐рдХ) рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдл рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ onCreate() рдУрд╡рд░рд▓реЛрдб onCreate() )ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ TweeterApp рдХреНрд▓рд╛рд╕ рдмрдирд╛рдИ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдХреА рдШрдЯрдХ рд╣реИрдВ (рдЯреНрд╡реАрдЯрд░ рдФрд░ рдЯрд╛рдЗрдорд▓рд╛рдЗрди)

 public class Injector { public static ObjectGraph graph; public static void init(Object... modules) { graph = ObjectGraph.create(modules); } public static void inject(Object target) { graph.inject(target); } } public class TweeterApp { public static void main(String... args) { Injector.init(new NetworkModule()); Tweeter tweeter = new Tweeter(); tweeter.tweet("Hello world"); Timeline timeline = new Timeline("Test User"); timeline.loadMore(20); for(Tweet tweet: timeline.get()) { System.out.println(tweet); } } } 


рдЕрдм рдирд┐рд░реНрднрд░рддрд╛ рдХреНрд╡реЗрд░реА рдкрд░ рд╡рд╛рдкрд╕:

 public class TwitterApi { @Inject private HttpClient client; public TwitterApi() { //     Injector.inject(this); //   ""  client  Dagger' } public void postTweet(String user, String tweet) { HttpUrlConnection connection = client.open("...."); /* post tweet */ } } 


рд╕реВрдЪрдирд╛ Injector.inject(Object) ред рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдореЗрдВ рд╡рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╛рдиреА рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ @Inject рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдЧреНрд░рд╛рдл рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рдл рдореЗрдВ рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдкреВрдЫрддреА рд╣реИрдВ (рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЛ ObjectGraph.inject() ) + рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ рдЧреНрд░рд╛рдл рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЕрдм рдЕрдкрдиреЗ рдореВрд▓ рдХрд╛рд░реНрдп рдкрд░ рд╡рд╛рдкрд╕ - рд╕рдм рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╣реЗрдЯрд╕реНрдЯреИрдХ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред NetworkModule рдореЙрдбреНрдпреВрд▓ рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ (рд╣рдореНрдо - рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ):
 @Provides @Singleton HttpClient provideHttpClient() { return new OkHttpClient(); } 


рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рдЬреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдЧреА:
 @Provides @Singleton HttpClient provideHttpClient() { if(Config.isDebugMode()) { return new MockHttpClient(); } return new OkHttpClient(); } 


рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рдХрд▓реНрдк рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИред рдбреИрдЧрд░ рдореЗрдВ, рдЖрдк рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдореЗрдВ overrides=true рдЬреЛрдбрд╝реЗрдВ:
 @Module(overrides=true, injects=TwitterApi.class) public class MockNetworkModule { @Provides @Singleton HttpClient provideHttpClient() { return new MockHttpClient(); } } 


рдЕрдм рддрдХ рдЬреЛ рднреА рдХрд░рдирд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдЯреЗрдЬ рдкрд░ рдЧреНрд░рд╛рдл рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИ:

 public class TweeterApp { public static void main(String... args) { Injector.init(new NetworkModule(), new MockNetworkModule()); Tweeter tweeter = new Tweeter(); tweeter.tweet("Hello world"); Timeline timeline = new Timeline("Test User"); timeline.loadMore(20); for(Tweet tweet: timeline.get()) { System.out.println(tweet); } } } 


рдЕрдм рд╣рдорд╛рд░реЗ рд╕рднреА рдЕрдиреБрд░реЛрдз рдЯреЗрд╕реНрдЯ Http рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВрдЧреЗред

рдпрд╣ Dagger'a рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ - рдореИрдВрдиреЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдПрдХ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдкрдврд╝рдирд╛ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо (рдКрдкрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдвреЗрд░ рдореЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ)
 //Entry point   public class TweeterApp { public static void main(String... args) { Injector.init(new NetworkModule()); Tweeter tweeter = new Tweeter(); tweeter.tweet("Hello world"); Timeline timeline = new Timeline("Test User"); timeline.loadMore(20); for(Tweet tweet: timeline.get()) { System.out.println(tweet); } } } //  public class Injector { public static ObjectGraph graph; public static void init(Object... modules) { graph = ObjectGraph.create(modules); } public static void inject(Object target) { graph.inject(target); } } //, Tweeter (   HttpClient  ) public class Tweeter { private TwitterApi api; public Tweeter() { this.api = new TwitterApi(); } public void tweet(String tweet) { api.postTweet("Test User", tweet); } } //TwitterApi,   HttpClient  Dagger'a public class TwitterApi { @Inject private HttpClient client; public TwitterApi() { //     Injector.inject(this); //   ""  client  Dagger' } public void postTweet(String user, String tweet) { HttpUrlConnection connection = client.open("...."); /* post tweet */ } } //,   HttpClient ,     ( ""   'injects' ) @Module(injects=TwitterApi.class) public class NetworkModule { @Provides @Singleton HttpClient provideHttpClient() { return new OkHttpClient(); } } 



рд╡рд┐рд╖рдп рдкрд░ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рдХреА рд╕реВрдЪреА:

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


All Articles