Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Android ½ÌÄãÒ»²½²½´î½¨MVP+Retrofit+RxJavaÍøÂçÇëÇó¿ò¼Ü
 
  3285  次浏览      31
 2017-12-11 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬ÕâÆªÎÄÕÂÖ÷ÒªÏêϸÐðÊöÁËAndroidÊÇÔõÑùÒ»²½²½´î½¨MVP+Retrofit+RxJavaÍøÂçÇëÇó¿ò¼ÜµÄ¡£

1.ʲôÊÇMVP£¿

MVP£¨Model View Presenter£©Æäʵ¾ÍÊÇÒ»ÖÖÏîÄ¿µÄÕûÌå¿ò¼Ü£¬ÄÜÈÃÄãµÄ´úÂë±äµÃ¸ü¼Ó¼ò½à£¬ËµÆð¿ò¼Ü´ó¼Ò¿ÉÄÜ»¹»áÏëµ½MVC¡¢MVVM¡£ÓÉÓÚÆª·ùÔ­Òò£¬ÕâÀïÎÒÃÇÏȲ»½²MVVM£¬ÏÈÀ´¿´Ò»ÏÂMVC¡£ÆäʵAndroid±¾Éí¾Í²ÉÓõÄÊÇMVC£¨Model View ģʽ¡¢ÆäÖÐModelÖ¸µÄÊÇÊý¾ÝÂß¼­ºÍʵÌåÄ£ÐÍ£»ViewÖ¸µÄÊDz¼¾ÖÎļþ¡¢ControllorÖ¸µÄÊÇActivity¡£¶ÔÓںܶàAndroid³õѧÕß¿ÉÄÜ»áÓÐÕâÑùµÄ¾­Àú£¬Ð´´úÂëµÄʱºò£¬²»¹ÜÈýÆß¶þʮһ¶¼ÍùActivityÖÐд£¬µ±È»ÎÒµ±³õÒ²ÊÇÕâô¸ÉµÄ£¬¸ù±¾¾ÍûÓÐʲô¿ò¼ÜµÄ¸ÅÄֻҪÄÜʵÏÖijһ¸ö¹¦ÄܾͺܿªÐÄÁË£¬Ã»ÓйÜÕâô¶à¡£µ±È»ÏîÄ¿±È½ÏС»¹ºÃ£¬Ò»µ©ÏîÄ¿±È½Ï´ó£¬Äã»á·¢ÏÖ£¬ActivityËù³Ðµ£µÄÈÎÎñÆäʵÊǺÜÖØµÄ£¬Ëü¼ÈÒª¸ºÔðÒ³ÃæµÄչʾºÍ½»»¥£¬»¹µÃ¸ºÔðÊý¾ÝµÄÇëÇóºÍÒµÎñÂß¼­Ö®ÀàµÄ¹¤×÷£¬Ï൱ÓÚ¼ÈÒª´òÀí¼ÒÍ¥£¬ÓÖÒª½ÌÓý×Ô¼ºµ÷ƤµÄº¢×Ó£¬ÕæÊÇÓÖµ±µùÓÖµ±Âè¡£¡£¡£ÄǸÃÔõô°ìÄØ£¿ÕâʱºòPresenterÕâ¸ö¼Ì¸¸À´µ½ÁËÕâ¸ö¼ÒÍ¥¡£¶Ô˵£¬ÎÒÀ´ÁË£¬ÒÔºóÄã¾Í±ðÕâôÐÁ¿àÁË£¬Äã¾ÍºÃºÃ´òÀíºÃViewÕâ¸ö¼Ò£¬ÎÒרÃÅÀ´¸ºÔð½ÌÓýModelÕ⺢×Ó£¬ÓÐʲôÇé¿öÎÒ»áÏòÄã·´Ó³µÄ¡£ÕâʱActivityÁ÷ÏÂÁËÐÒ¸£µÄÑÛÀᣬ´Ó´Ë£¬Model¡¢View£¨Activity£©¡¢PresenterÒ»¼ÒÈý¿Ú¹ýÉÏÁËÐÒ¸£µÄÉú»î¡£¡£¡£ºÃÁ˿ĸöÒ©¼ÌÐø£¬ÓÉÓÚPresenter£¨ÎÒÃÇ×Ô¼º½¨µÄÀࣩµÄ³öÏÖ£¬¿ÉÒÔʹView£¨Activity£©²»ÓÃÖ±½ÓºÍModel´ò½»µÀ£¬ViewÖ»ÓøºÔðÒ³ÃæµÄÏÔʾºÍ½»»¥£¬Ê£ÏµĺÍModel½»»¥µÄÊÂÇé¶¼½»¸øPresenter×ö£¬±ÈÈçÒ»Ð©ÍøÂçÇëÇó¡¢Êý¾ÝµÄ»ñÈ¡µÈ£¬µ±Presenter»ñÈ¡µ½Êý¾ÝºóÔÙ½»¸øView£¨Activity£©½øÐÐչʾ£¬ÕâÑù£¬ActivityµÄÈÎÎñ¾Í´ó´ó¼õСÁË¡£Õâ±ãÊÇMVP£¨Model »¹ÊÇÖ¸µÄÊý¾ÝÂß¼­ºÍʵÌåÄ£ÐÍ£¬ViewÖ¸µÄÊÇActivity£¬P¾ÍÊÇPresenter£©¿ò¼ÜµÄ¹¤×÷·½Ê½¡£

2.ʲôÊÇRetrofit£¿

½ÓÏÂÀ´ÎÒÃÇ¿´Ò»ÏÂʲôÊÇRetrofit¡£ÔÚ¹ÙÍø¶ÔRetrofitµÄÃèÊöÊÇÕâÑùµÄ

A type-safe HTTP client for Android and Java˵ÈË»°¾ÍÊÇ¡°Ò»¸öÀàÐͰ²È«µÄÓÃÓÚAndroidºÍJavaÍøÂçÇëÇóµÄ¿Í»§¶Ë¡±£¬Æäʵ¾ÍÊÇÒ»¸ö·â×°ºÃµÄÍøÂçÇëÇó¿â¡£½ÓÏÂÀ´¾ÍÀ´¿´Ò»ÏÂÕâ¸ö¿â¸ÃÔõôÓá£Ê×ÏÈÎÒÔÚÍøÉÏÕÒÁËÒ»¸öAPI½Ó¿ÚÓÃÓÚ²âÊÔ£ºÕâÊÇÒ»¸öÓÃÓÚ²éѯһ±¾ÊéÏêϸÐÅÏ¢µÄÒ»¸öÇëÇó½Ó¿Ú¡£Èç¹ûÖ±½ÓÓÃä¯ÀÀÆ÷´ò¿ªµÄ»°»á·µ»ØÒÔÏÂÄÚÈÝ£º

ä¯ÀÀÆ÷Öзµ»ØÄÚÈÝ

½ÓÏÂÀ´ÎÒÃÇÀ´¿´¿´ÈçºÎÓÃRetrofit½«ÉÏÃæµÄÇëÇóÏÂÀ´¡£ÎªÁËÔÚAndroid StudioÖÐÌí¼ÓRetrofit¿â£¬ÎÒÃÇÐèÒªÌí¼ÓÈçÏÂÒÀÀµ£º

compile 'com.squareup.retrofit2:retrofit:2.1.0'

ºÃÁË£¬Ìí¼ÓÍê¸Ã¿â£¬ÎÒÃÇÔÙÀ´¿´¿´ÈçºÎʹÓã¬Ê×ÏÈÎÒÃÇÀ´½¨Ò»¸öʵÌåÀàBook£¬ÓÃÓÚ×°ÍøÂçÇëÇóºó·µ»ØµÄÊý¾Ý¡£ÕâÀï˳´øËµÒ»Ï£¬ÓеÄÈ˽¨Ò»¸öʵÌåÀàʱ¿ÉÄÜ»á¸ù¾Ýä¯ÀÀÆ÷Öзµ»ØÖеÄÊý¾ÝÒ»ÐÐÒ»ÐÐÇã¬ÆäʵÕâÑù·Ç³£Âé·³£¬ÕâÀï½Ì´ó¼ÒÒ»¸ö¼òµ¥µÄ·½·¨£¬Ë²¼äÉú³ÉÒ»¸öʵÌåÀࡣû´íÓеÄÈË¿ÉÄÜÓùý£¬ÎÒÃÇÐèÒªÒ»¸ö²å¼þGsonFormat¡£ËüµÄʹÓÃÒ²ºÜ¼òµ¥£¬Ê×ÏÈÐèÒªÔÚAndroidÖÐÏÂÔØ£¬µã»÷×óÉϽDz˵¥À¸ÖеÄFile,È»ºóµã»÷Settings£¬ÔÚµ¯´°ÖÐÑ¡ÔñPlugins,È»ºóµã»÷Ï·½µÄBrowse

È»ºóÔÚдò¿ªµÄ´°¿ÚÖÐËÑË÷GsonFormat£¬µã»÷ÓÒ²àÂÌÉ«°´Å¥¾Í¿ÉÒÔÏÂÔØ°²×°ÁË£¬°²×°ÍêÐèÒªÖØÆôÏÂstudio£¬¾Í¿ÉÒÔÓÃÁË¡£

ËüµÄÓ÷¨Ò²ºÜ¼òµ¥£¬±ÈÈçÄãÏȽ¨Á¢Ò»¸öеĿÕÀàÈ¡ÃûBook£¬È»ºóÔÚÀïÃæ°´Alt+insert,»áÓиöСµ¯´°Ñ¡ÔñGsonFormat,Ö®ºóÔÚµ¯³öµÄ±à¼­¿òÖп½ÈëÔÚä¯ÀÀÆ÷ÖÐÇëÇóÏÂÀ´µÄÄÇÒ»Ûç¶«Î÷£¬È»ºóÒ»Ö±µãok¾Í»á×Ô¶¯Éú³É×ֶΣ¬ÒÔ¼°setºÍget·½·¨£¬Ò»»á¶ùÎÒÃÇÓÃRetrofitÇëÇóÏÂÀ´µÄÊý¾Ý¶¼»á±£´æÔÚÕâ¸öʵÌåÀàÖУ¬»¹ÊÇͦ·½±ãµÄ¡£×îºóÎÒÃÇÀïÃæÌí¼ÓÒ»¸ötoString()·½·¨£¬ÓÃÓÚºóÃæÏÔʾ·½±ã¡£

½ÓÏÂÀ´£¬»Øµ½ÎÒÃǵÄRetrofitÖÐÉÏ£¬ÊµÌåÀàÒѾ­½¨ºÃÁË£¬ÎÒÃÇÀ´¿´¿´Õâ¸öRetrofitÈçºÎ½øÐÐÍøÂçÇëÇ󣬯äʵ´úÂëÒ²ºÜ¼òµ¥¡£Ê×ÏÈÎÒÃÇÐèÒª¶¨ÒåÒ»¸ö½Ó¿Ú£¬È¡ÃûRetrofitService £º

public interface RetrofitService {
@GET("book/search")
Call<Book> getSearchBook(@Query("q") String name,
@Query("tag") String tag,
@Query("start") int start,
@Query("count") int count);
}

¶î¡£¡£Ïë±ØÓÐÈËÒªÎÊÁË£¬ÕâÊÇÊ²Ã´ÍæÒ⣿¸úÎÒÃÇÆ½Ê±¶¨ÒåµÄ½Ó¿ÚÀàºÜÏñ£¬µ«ÓÖ²»Ò»Ñù¡£±ðÐļ±£¬ÎÒÀ´Ò»Ò»½âÊÍÏ£¬ºÍ±ðµÄ½Ó¿ÚÀàÒ»Ñù£¬ÎÒÃÇÔÚÆäÖж¨ÒåÁËÒ»¸ö·½·¨getSearchBook£¬ÄÇôÕâ¸ö·½·¨ÊÇ×öʲôµÄÄØ£¿ÆäʵËü¸ÉµÄʺܼòµ¥£¬¾ÍÊÇÆ´½ÓÒ»¸öURLÈ»ºó½øÐÐÍøÂçÇëÇó¡£ÕâÀïÎÒÃÇÆ´½ÓµÄURL¾ÍÊÇÉÏÎÄÌáµ½µÄ²âÊÔURL:https://api.douban.com/v2/book/search?q=½ðƿ÷&tag=&start=0&count=1¡£´ÏÃ÷µÄÄãÒ»¶¨¿´³öÀ´ÁË£¬ÔÚÕâ¸öURLÖÐbook/search¾ÍÊÇGETºóµÄÖµ£¬¶ø?ºóµÄq¡¢tag¡¢µÈÈë²Î¾ÍÊÇÕâ¸ö·½·¨µÄÈë²Î¡£ÓеÄÅóÓÑ¿ÉÄÜÒªÎÊÁË£¬https://api.douban.com/v2/Õâôһ´ó´®ÅÜÄÄÈ¥ÁË£¿ÆäʵÎÒÃÇÔÚ½øÐÐÍøÂçÇëÇóʱ£¬ÔÚURLÖÐǰһ²¿·ÖÊÇÏà¶Ô²»±äµÄ¡£Ê²Ã´ÒâË¼ÄØ£¬±ÈÈçÄã´ò¿ª¼äÊéÍøÕ¾£¬ÔÚ¼äÊéÖÐÄã´ò¿ª²»Í¬µÄÍøÒ³£¬ËäÈ»ËüµÄURL²»Í¬£¬µ«Äã»á·¢ÏÖ£¬Ã¿¸öURLÇ°Ãæ¶¼ÊÇÒÔhttp://www.jianshu.com/¿ªÍ·,ÎÒÃǰÑÕâ¸ö²»±äµÄ²¿·Ö£¬Ò²½Ð×öbaseUrlÌá³öÀ´£¬·Åµ½ÁíÒ»¸öµØ·½,ÔÚÏÂÃæÎÒÃÇ»áÌáµ½¡£ÕâÑùÎÒÃÇÒ»¸öÍêÕûµÄURL¾ÍÆ´½ÓºÃÁË¡£ÔÚ·½·¨µÄ¿ªÍ·ÎÒÃÇ¿ÉÒÔ¿´µ½ÓиöGETµÄ×¢ÊÍ£¬ËµÃ÷Õâ¸öÇëÇóÊÇGET·½·¨£¬µ±È»ÄãÒ²¿ÉÒÔ¸ù¾Ý¾ßÌåÐèÒªÓÃPOST¡¢PUT¡¢DELETEÒÔ¼°HEAD¡£ËûÃǵÄÇø±ðÈçÏ£º

1.GET ----------²éÕÒ×ÊÔ´£¨²é£©

2.POST --------ÐÞ¸Ä×ÊÔ´£¨¸Ä£©

3.PUT ----------ÉÏ´«Îļþ£¨Ôö£©

4.DELETE ----ɾ³ýÎļþ£¨É¾£©

5.HEAD--------Ö»ÇëÇóÒ³ÃæµÄÊײ¿

È»ºóÎÒÃÇÀ´¿´Ò»ÏÂÕâ¸ö·½·¨µÄ·µ»ØÖµ£¬Ëü·µ»ØCallʵÌ壬һ»áÎÒÃÇÒªÓÃËü½øÐоßÌåµÄÍøÂçÇëÇó£¬ÎÒÃÇÐèҪΪËüÖ¸¶¨·ºÐÍΪBookÒ²¾ÍÊÇÎÒÃÇÊý¾ÝµÄʵÌåÀà¡£½ÓÏÂÀ´£¬Äã»á·¢ÏÖÕâ¸ö·½·¨µÄÈë²ÎºÍÎÒÃÇÆ½Ê±·½·¨µÄÈë²Î»¹²»´óÒ»Ñù¡£ÔÚÿ¸öÈë²Îǰ»¹¶àÁËÒ»¸ö×¢½â¡£±ÈÈçµÚÒ»¸öÈë²Î@Query("q") String name£¬Query±íʾ°ÑÄã´«ÈëµÄ×Ö¶ÎÆ´½ÓÆðÀ´£¬±ÈÈçÔÚ²âÊÔurlÖÐÎÒÃÇ¿ÉÒÔ¿´µ½q=½ðƿ÷µÄÈë²Î£¬ÄÇôQueryºóÃæµÄÖµ±ØÐëÊÇq£¬ÒªºÍurlÖб£³Ö²»±ä£¬È»ºóÎÒÃǶ¨ÒåÁËStringÀàÐ͵Äname£¬µ±µ÷ÓÃÕâ¸ö·½·¨ÊÇ£¬ÓÃÓÚ´«Èë×Ö·û´®£¬±ÈÈç¿ÉÒÔ´«Èë¡°½ðƿ÷¡±¡£ÄÇôÕâ¸ö·½·¨¾Í»á×Ô¶¯ÔÚqºóÃæÆ´ÉÏÕâ¸ö×Ö·û´®½øÐÐÍøÂçÇëÇó¡£ÒÔ´ËÀàÍÆ£¬Õâ¸öurlÐèÒª¼¸¸öÈë²ÎÄã¾ÍÔÚÕâ¸ö·½·¨Öж¨Ò弸¸öÈë²Î£¬Ã¿¸öÈë²Îǰ¶¼Òª¼ÓÉÏQuery×¢½â¡£µ±È»Retrofit³ýÁË Query Õâ¸ö×¢½âÍ⣬»¹ÓÐÆäËû¼¸¸ö±ÈÈ磺@QueryMap¡¢@Path¡¢@Body¡¢@FormUrlEncoded/@Field¡¢ @Header / @Headers ¡£ ÎÒÃÇÀ´¿´Ò»ÏÂËûÃǵÄÇø±ð:

@Query(GETÇëÇó):

ÓÃÓÚÔÚurlºóÆ´½ÓÉϲÎÊý£¬ÀýÈ磺

@GET("book/search")
Call<Book> getSearchBook(@Query("q") String name);//nameÓɵ÷ÓÃÕß´«Èë

Ï൱ÓÚ£º

@GET("book/search?q=name")
Call<Book> getSearchBook();

@QueryMap(GETÇëÇó):

µ±È»Èç¹ûÈë²Î±È½Ï¶à£¬¾Í¿ÉÒÔ°ÑËüÃǶ¼·ÅÔÚMapÖУ¬ÀýÈ磺

@GET("book/search")
Call<Book> getSearchBook(@QueryMap Map<String, String> options);

@Path(GETÇëÇó):

ÓÃÓÚÌæ»»urlÖÐij¸ö×ֶΣ¬ÀýÈ磺

@GET("group/{id}/users")
Call<Book> groupList(@Path("id") int groupId);

ÏñÕâÖÖÇëÇó½Ó¿Ú£¬ÔÚgroupºÍuserÖ®¼äÓиö²»È·¶¨µÄidÖµÐèÒª´«È룬¾Í¿ÉÒÔÕâÖÖ·½·¨¡£ÎÒÃǰѴý¶¨µÄÖµ×Ö¶ÎÓÃ{}À¨ÆðÀ´£¬µ±È» {}ÀïµÄÃû×Ö²»Ò»¶¨¾ÍÊÇid£¬¿ÉÒÔÈÎÈ¡£¬µ«ÐèºÍ@PathºóÀ¨ºÅÀïµÄÃû×ÖÒ»Ñù¡£Èç¹ûÔÚuserºóÃæ»¹ÐèÒª´«Èë²ÎÊýµÄ»°£¬¾Í¿ÉÒÔÓÃQueryÆ´½ÓÉÏ£¬±ÈÈ磺

@GET("group/{id}/users")
Call<Book> groupList(@Path("id") int groupId,@Query("sort") String sort);

µ±ÎÒÃǵ÷ÓÃÕâ¸ö·½·¨Ê±£¬¼ÙÉèÎÒÃÇgroupId´«Èë1£¬sort´«Èë¡°2¡±£¬ÄÇôËüÆ´½Ó³ÉµÄurl¾ÍÊÇgroup/1/users?sort=2£¬µ±È»×îºóÇëÇóµÄ»°»¹»á¼ÓÉÏÇ°ÃæµÄbaseUrl¡£

@Body(POSTÇëÇó):

¿ÉÒÔÖ¸¶¨Ò»¸ö¶ÔÏó×÷ΪHTTPÇëÇóÌå,±ÈÈ磺

@POST("users/new")
Call<User> createUser(@Body User user);

Ëü»á°ÑÎÒÃÇ´«ÈëµÄUserʵÌåÀàת»»ÎªÓÃÓÚ´«ÊäµÄHTTPÇëÇóÌ壬½øÐÐÍøÂçÇëÇó¡£

@Field(POSTÇëÇó):

ÓÃÓÚ´«ËÍ±íµ¥Êý¾Ý£º

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

×¢Ò⿪ͷ±ØÐë¶à¼ÓÉÏ@FormUrlEncodedÕâ¾ä×¢ÊÍ£¬²»È»»á±¨´í¡£±íµ¥×ÔÈ»ÊÇÓжà×é¼üÖµ¶Ô×é³É£¬ÕâÀïµÄfirst_name¾ÍÊǼü£¬¶ø¾ßÌå´«ÈëµÄfirst¾ÍÊÇÖµÀ²¡£

@Header/@Headers(POSTÇëÇó):

ÓÃÓÚÌí¼ÓÇëÇóÍ·²¿£º

@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

±íʾ½«Í·²¿AuthorizationÊôÐÔÉèÖÃΪÄã´«ÈëµÄauthorization£»µ±È»Ä㻹¿ÉÒÔÓÃ@Headers±íʾ,×÷ÓÃÊÇÒ»ÑùµÄ±ÈÈ磺

@Headers("Cache-Control: max-age=640000")
@GET("user")
Call<User> getUser()

µ±È»Äã¿ÉÒÔ¶à¸öÉèÖãº

@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("user")
Call<User> getUser()

ºÃÁË£¬ÕâÑùÎÒÃǾͰÑÉÏÃæÕâ¸öRetrofitService ½Ó¿ÚÀà½âÊ͵IJ¶àÁË¡£ÎÒ¾õµÃ£¬Retrofit×îÖ÷ÒªµÄÒ²¾ÍÊÇÕâ¸ö½Ó¿ÚÀàµÄ¶¨ÒåÁË¡£ºÃÁË£¬ÓÐÁËÕâ¸ö½Ó¿ÚÀ࣬ÎÒÃÇÀ´¿´Ò»Ï£¬µ½µ×ÈçºÎʹÓÃÕâ¸öÎÒÃǶ¨ÒåµÄ½Ó¿ÚÀ´½øÐÐÍøÂçÇëÇó¡£´úÂëÈçÏ£º

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.douban.com/v2/")
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder().create()))
.build();
RetrofitService service = retrofit.create(RetrofitService.class);
Call<Book> call = service.getSearchBook("½ðƿ÷", null, 0, 1);
call.enqueue(new Callback<Book>() {
@Override
public void onResponse(Call<Book> call, Response<Book> response) {
text.setText(response.body()+"");
}
@Override
public void onFailure(Call<Book> call, Throwable t) {
}
});

ÕâÀïÎÒÃÇ¿ÉÒÔ¿´µ½£¬ÏÈн¨ÁËÒ»¸öRetrofit¶ÔÏó£¬È»ºó¸øËüÉèÖÃÒ»¸öÎÒÃÇÇ°ÃæËµÒòΪ½Ó¿Ú·µ»ØµÄÊý¾Ý²»ÊÇÎÒÃÇÐèÒªµÄʵÌåÀ࣬ÎÒÃÇÐèÒªµ÷ÓÃaddConverterFactory·½·¨½øÐÐת»»¡£ÓÉÓÚ·µ»ØµÄÊý¾ÝΪjsonÀàÐÍ£¬ËùÒÔÔÚÕâ¸ö·½·¨Öд«ÈëGsonת»»¹¤³§GsonConverterFactory.create(new GsonBuilder() . create () ) £¬ÕâÀïÎÒÃÇÐèÒªÔÚstudioÖÐÌí¼ÓGsonµÄÒÀÀµ£º

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

È»ºóÎÒÃǵ÷ÓÃretrofitµÄcreate·½·¨²¢´«ÈëÉÏÃæÎÒÃǶ¨ÒåµÄ½Ó¿ÚµÄÎļþÃû RetrofitService . class £¬ ¾Í¿ÉÒԵõ½RetrofitService µÄʵÌå¶ÔÏó¡£ÓÐÁËÕâ¸ö¶ÔÏó£¬ÎÒÃǾͿÉÒÔµ÷ÓÃÀïÃæÖ®Ç°¶¨ÒåºÃµÄÇëÇó·½·¨ÁË¡£±ÈÈ磺

Call<Book> call = service.getSearchBook("½ðƿ÷", null, 0, 1);

Ëü»á·µ»ØÒ»¸öCallʵÌåÀ࣬Ȼºó¾Í¿ÉÒÔµ÷ÓÃCallµÄenqueue·½·¨½øÐÐÒì²½ÇëÇó£¬ÔÚenqueue·½·¨Öд«ÈëÒ»¸ö»Øµ÷ÖØÐ´ÀïÃæµÄonResponseºÍonFailure·½·¨£¬Ò²¾ÍÊÇÇëÇó³É¹¦ºÍʧ°ÜµÄ»Øµ÷·½·¨¡£µ±³É¹¦Ê±£¬Ëü»á·µ»ØResponse£¬Àï±ß·â×°ÁËÇëÇó½á¹ûµÄËùÓÐÐÅÏ¢£¬°üÀ¨±¨Í·£¬·µ»ØÂ룬»¹ÓÐÖ÷ÌåµÈ¡£±ÈÈçµ÷ÓÃËüµÄbody()·½·¨¾Í¿É»ñµÃBook¶ÔÏó£¬Ò²¾ÍÊÇÎÒÃÇÐèÒªµÄÊý¾Ý¡£ÕâÀïÎÒÃǾͰѷµ»ØµÄBook£¬ÏÔʾÆÁÄ»ÉÏ¡£ÈçÏÂͼ£º

BookÖеÄÊý¾Ý

ºÃÁË£¬µ½ÕâÀïÎÒÃǾͻù±¾Á˽âÁËRetrofitµÄÕû¸ö¹¤×÷Á÷³Ì¡£

3.RxJava

ÎÒÃÇÕâÆªÎÄÕÂÖ÷Òª½éÉܴÕûÌåÍøÂçÇëÇó¿ò¼Ü£¬ËùÒÔ¹ØÓÚRxJavaµÄ»ù´¡ÖªÊ¶£¬ÎÒÕâ¾Í²»ÔÙÏêϸ½éÉÜÁË£¬ÍøÉÏÒ²ÓкܶàÎÄÕ£¬¶ÔRxJava»¹²»ÊǺÜÁ˽âµÄͬѧ£¬ÍƼöÄã¿´Ò»ÏÂÅ×ÎïÏßµÄÕâÆªÎÄÕ¸ø Android ¿ª·¢ÕßµÄ RxJava Ïê½â

ÏÂÃæÎÒÃÇÀ´¿´Ò»ÏÂRxJavaºÍretrofitµÄ½áºÏʹÓã¬ÎªÁËʹ Rxjava Óë retrofit ½áºÏ£¬ÎÒÃÇÐèÒªÔÚ Retrofit ¶ÔÏó½¨Á¢µÄʱºòÌí¼ÓÒ»¾ä´úÂë addCallAdapterFactory(RxJavaCallAdapterFactory . create ()) £¬µ±È»Ä㻹ÐèÒªÔÚ build . gradle ÎļþÖÐÌí¼ÓÈçÏÂÒÀÀµ£º

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

ÍêÕûµÄ´úÂëÈçÏ£º

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.douban.com/v2/")
.addConverterFactory(GsonConverterFactory.

create(new GsonBuilder().create()))
.addCallAdapterFactory(RxJavaCallAdapter

Factory.create())//Ö§³ÖRxJava
.build();

È»ºóÎÒÃÇ»¹ÐèÒªÐÞ¸ÄRetrofitService ÖеĴúÂ룺

public interface RetrofitService {
@GET("book/search")
Observable<Book> getSearchBook(@Query("q")

String name,
@Query("tag") String tag, @Query("start") int start,
@Query("count") int count);

¿ÉÒÔ¿´µ½£¬ÔÚÔ­À´µÄRetrofitService ÖÐÎÒÃǰÑgetSearchBook·½·¨·µ»ØµÄÀàÐÍCall¸ÄΪÁËObservable£¬Ò²¾ÍÊDZ»¹Û²ìÕß¡£ÆäËû¶¼Ã»±ä¡£È»ºó¾ÍÊÇ´´½¨RetrofitService ʵÌåÀࣺ

RetrofitService service = retrofit.create

(RetrofitService.class);

ºÍÉÏÃæÒ»Ñù£¬´´½¨ÍêRetrofitService £¬¾Í¿ÉÒÔµ÷ÓÃÀïÃæµÄ·½·¨ÁË£º

Observable<Book> observable = service.getSearchBook("½ðƿ÷", null, 0, 1);

ÆäʵÕâÒ»²½£¬¾ÍÊÇ´´½¨ÁËÒ»¸örxjavaÖÐobservable£¬¼´±»¹Û²ìÕß,ÓÐÁ˱»¹Û²ìÕߣ¬¾ÍÐèÒªÒ»¸ö¹Û²ìÕߣ¬ÇÒ¶©ÔÄËü£º

observable.subscribeOn(Schedulers.io())//ÇëÇóÊý¾ÝµÄʼþ·¢ÉúÔÚioÏß³Ì
.observeOn(AndroidSchedulers.mainThread())//ÇëÇóÍê³ÉºóÔÚÖ÷Ï̸߳üÏÔUI
.subscribe(new Observer<Book>() {//¶©ÔÄ
@Override
public void onCompleted() {
//ËùÓÐʼþ¶¼Íê³É£¬¿ÉÒÔ×öЩ²Ù×÷¡£¡£¡£
}
@Override
public void onError(Throwable e) {
e.printStackTrace(); //ÇëÇó¹ý³ÌÖз¢Éú´íÎó
}
@Override
public void onNext(Book book) {//ÕâÀïµÄbook¾ÍÊÇÎÒÃÇÇëÇó½Ó¿Ú·µ»ØµÄʵÌåÀà
}
}

ÔÚÉÏÃæÖÐÎÒÃÇ¿ÉÒÔ¿´µ½£¬Ê¼þµÄÏû·ÑÔÚAndroidÖ÷Ị̈߳¬ËùÒÔÎÒÃÇ»¹ÒªÔÚbuild.gradleÖÐÌí¼ÓÈçÏÂÒÀÀµ£º

compile 'io.reactivex:rxandroid:1.2.0'

ÕâÑùÎÒÃǾÍÒýÈëÁËRxAndroid£¬RxAndroidÆäʵ¾ÍÊǶÔRxJavaµÄÀ©Õ¹¡£±ÈÈçÉÏÃæÕâ¸öAndroidÖ÷Ïß³ÌÔÚRxJavaÖоÍûÓУ¬Òò´ËҪʹÓõϰ¾Í±ØÐëµÃÒýÓÃRxAndroid¡£

4.ʵ¼ù

½ÓÏÂÀ´ÎÒÃǾͿ´¿´£¬ÔÚÒ»¸öÏîÄ¿ÖÐÉÏÃæÈýÕßÊÇÈçºÎÅäºÏµÄ¡£ÎÒÃÇ´ò¿ªAndroid Studio£¬Ð½¨Ò»¸öÏîĿȡÃûΪMVPDemo¡£Õâ¸ödemoµÄ¹¦ÄÜÒ²ºÜ¼òµ¥£¬¾ÍÊǵã»÷°´Å¥µ÷ÓÃÉÏÃæµÄÄǸö²âÊÔ½Ó¿Ú£¬½«ÇëÇóÏÂÀ´ÊéµÄÐÅÏ¢ÏÔʾÔÚÆÁÄ»ÉÏ¡£Ê×ÏÈÎÒÃÇÀ´¿´Ò»ÏÂÕâ¸ö¹¤³ÌµÄĿ¼½á¹¹£º

¹¤³ÌĿ¼

ÎÒÃÇ¿ÉÒÔ¿´µ½£¬ÔÚÏîÄ¿µÄ°üÃûÏ£¬ÎÒÃǽ¨ÁËÈý¸öÖ÷ÒªµÄÎļþ¼Ð£ºapp¡¢service¡¢ui¡£µ±È»¸ù¾ÝÏîÄ¿µÄÐèÒªÄãÒ²¿ÉÒÔÌí¼Ó¸ü¶àÆäËûµÄÎļþ¼Ð£¬±ÈÈçһЩ¹¤¾ßÀàµÈ¡£ÆäÖÐappÎļþ¼ÐÖпÉÒÔ½¨Ò»¸öApplicationÀ࣬ÓÃÓÚÉèÖÃÓ¦ÓÃÈ«¾ÖµÄһЩÊôÐÔ£¬ÕâÀïΪÁËʹÏîÄ¿¸ü¼Ó¼òµ¥¾ÍûÓÐÌí¼Ó£»È»ºó£¬ÎÒÃÇÔÙÀ´¿´¿´uiÎļþ¼ÐÏ£¬Õâ¸öÎļþ¼ÐÏÂÖ÷Òª·ÅһЩ¹ØÓÚ½çÃæµÄ¶«Î÷¡£ÔÚÀïÃæÎÒÃÇÓÖ½¨ÁËÈý¸öÎļþ¼Ð£ºactivity¡¢adapter¡¢fragment£¬ÎÒÏë¿´Ãû×ÖÄã¾ÍÇå³þÀïÃæÒª·ÅʲôÁË¡£×îºóÎÒÃÇÔÚÖØµã¿´¿´serviceÎļþ¼ÐÖеĶ«Î÷¡£Ê×ÏÈÎÒÃÇÀ´¿´¿´ÀïÃæÖØÒªµÄÁ½¸öÀࣺRetrofitHelperºÍRetrofitService¡£RetrofitHelperÖ÷ÒªÓÃÓڵijõʼ»¯£º

public class RetrofitHelper {
private Context mCntext;
OkHttpClient client = new OkHttpClient();
GsonConverterFactory factory = GsonConver

terFactory.create(new GsonBuilder().create());
private static RetrofitHelper instance = null;
private Retrofit mRetrofit = null;
public static RetrofitHelper getInstance(Context

context){
if (instance == null){
instance = new RetrofitHelper(context);
}
return instance;
}
private RetrofitHelper(Context mContext){
mCntext = mContext;
init();
}
private void init() {
resetApp();
}
private void resetApp() {
mRetrofit = new Retrofit.Builder()
.baseUrl("https://api.douban.com/v2/")
.client(client)
.addConverterFactory(factory)
.addCallAdapterFactory(RxJavaCallAdapterFactory.

create())
.build();
}
public RetrofitService getServer(){
return mRetrofit.create(RetrofitService.class);
}
}

´úÂë²¢²»¸´ÔÓ£¬ÆäÖÐresetApp·½·¨£¬¾ÍÊÇÇ°Ãæ½éÉܵÄRetrofitµÄ´´½¨£¬getServer·½·¨¾ÍÊÇΪÁË»ñÈ¡RetrofitService½Ó¿ÚÀàµÄʵÀý»¯¡£È»ºó¶¨ÒåÁËÒ»¸ö¾²Ì¬·½·¨getInstanceÓÃÓÚ»ñÈ¡×ÔÉíRetrofitHelperµÄʵÀý»¯£¬²¢ÇÒÖ»»áʵÀý»¯Ò»´Î¡£

½ÓÏÂÀ´£¬¿´Ò»ÏÂRetrofitService£¬ÆäÖдúÂ뻹ÊÇÉÏÃæÒ»Ñù£º

public interface RetrofitService {
@GET("book/search")
Observable<Book> getSearchBooks(@Query("q")

String name,
@Query("tag") String tag, @Query("start")

int start,
@Query("count") int count);
}

È»ºóÎÒÃÇÒÀ´ÎÀ´¿´Ò»ÏÂserviceÎļþ¼ÐϵÄËĸöÎļþ¼Ð£ºentity¡¢manager¡¢presenterºÍview¡£ÆäÖÐentityÏ·ÅÎÒÃÇÇëÇóµÄʵÌåÀ࣬ÕâÀï¾ÍÊÇBook¡£½ÓÏÂÀ´ÎÒÃÇÀ´¿´Ò»ÏÂmanagerÖÐDataManager¡£Õâ¸öÀàÆäʵ¾ÍÊÇΪÁËÈÃÄã¸ü·½±ãµÄµ÷Öж¨ÒåµÄ·½·¨£º

public class DataManager {
private RetrofitService mRetrofitService;
public DataManager(Context context){
this.mRetrofitService = RetrofitHelper.getInstance(context).getServer();
}
public Observable<Book> getSearchBooks(String

name,String tag,int start,int count){
return mRetrofitService.getSearchBooks(name,

tag,start,count);
}
}

¿ÉÒÔ¿´µ½£¬ÔÚËüµÄ¹¹Ôì·½·¨ÖУ¬ÎÒÃǵõ½ÁËRetrofitService µÄʵÀý»¯£¬È»ºó¶¨ÒåÁËÒ»¸öºÍRetrofitService ÖÐͬÃûµÄ·½·¨£¬ÀïÃæÆäʵ¾ÍÊǵ÷ÓÃRetrofitService ÖеÄÕâ¸ö·½·¨¡£ÕâÑù£¬°ÑRetrofitService Öж¨ÒåµÄ·½·¨¶¼·â×°µ½DataManager ÖУ¬ÒÔºóÎÞÂÛÔÚÄĸöÒªµ÷Ó÷½·¨Ê±Ö±½ÓÔÚDataManager Öе÷ÓþͿÉÒÔÁË£¬¶ø²»ÊÇÖØ¸´½¨Á¢RetrofitService µÄʵÀý»¯£¬ÔÙµ÷ÓÃÆäÖеķ½·¨¡£

ºÃÁË£¬ÎÒÃÇÔÙÀ´¿´Ò»ÏÂpresenterºÍview£¬ÎÒÃÇÔÚÇ°ÃæËµ¹ý£¬presenterÖ÷ÒªÓÃÓÚÍøÂçµÄÇëÇóÒÔ¼°Êý¾ÝµÄ»ñÈ¡£¬view¾ÍÊǽ«presenter»ñÈ¡µ½µÄÊý¾Ý½øÐÐչʾ¡£Ê×ÏÈÎÒÃÇÏÈÀ´¿´view£¬ÎÒÃÇ¿´µ½ÎÒÃǽ¨ÁËÁ½¸ö½Ó¿ÚÀàViewºÍBookView,ÆäÖÐViewÊǿյģ¬Ö÷ÒªÓÃÓÚºÍAndroidÖеÄViewÇø±ð¿ªÀ´£º

public interface View {
}

È»ºóÈÃBookView¼Ì³Ð×ÔÎÒÃÇ×Ô¼º¶¨ÒåµÄView £º

public interface BookView extends View {
void onSuccess(Book mBook);
void onError(String result);
}

¿ÉÒÔ¿´µ½ÔÚÀïÃæ¶¨ÒåÁ½¸ö·½·¨£¬Ò»¸öonSuccess£¬Èç¹ûpresenterÇëÇó³É¹¦£¬½«Ïò¸Ã·½·¨´«ÈëÇëÇóÏÂÀ´µÄʵÌåÀ࣬Ҳ¾ÍÊÇBook£¬viewÄõ½Õâ¸öÊý¾ÝʵÌåÀàºó£¬¾Í¿ÉÒÔ½øÐйØÓÚÕâ¸öÊý¾ÝµÄչʾ»òÆäËûµÄһЩ²Ù×÷¡£Èç¹ûÇëÇóʧ°Ü£¬¾Í»áÏòÕâ¸öview´«Èëʧ°ÜÐÅÏ¢£¬Äã¿ÉÒÔµ¯¸öToastÀ´ÌáʾÇëÇóʧ°Ü¡£Í¨³£ÕâÁ½¸ö·½·¨±È½Ï³£Ó㬵±È»Äã¿ÉÒÔ¸ù¾ÝÏîÄ¿ÐèÒªÀ´¶¨ÒåһЩÆäËûµÄ·½·¨¡£½ÓÏÂÀ´ÎÒÃÇ¿´¿´presenterÊÇÈçºÎ½øÐÐÍøÂçÇëÇóµÄ ¡£ÎÒÃÇÒ²¶¨ÒåÁËÒ»¸ö»ù´¡Presenter£º

public interface Presenter {
void onCreate();
void onStart();//ÔÝʱûÓõ½
void onStop();
void pause();//ÔÝʱûÓõ½
void attachView(View view);
void attachIncomingIntent(Intent intent);//ÔÝʱûÓõ½
}

ÀïÃæÎÒÃÇ¿ÉÒÔ¿´µ½£¬¶¨ÒåÁËһЩ·½·¨£¬Ç°Ã漸¸öonCreate¡¢onStartµÈ·½·¨¶ÔÓ¦×ÅActivityÖÐÉúÃüÖÜÆÚµÄ·½·¨£¬µ±È»Ã»±ØÒªÐ´ÉÏActivityÉúÃüÖÜÆÚÖÐËùÓлص÷·½·¨£¬Í¨³£Ò²¾ÍÓõ½ÁËonCreateºÍonStop£¬³ý·ÇÐèÇóºÜ¸´ÔÓ£¬ÔÚActivity²»Í¬ÉúÃüÖÜÆÚÇëÇóµÄÇé¿ö²»Í¬¡£½Ó×ÅÎÒÃǶ¨ÒåÁËÒ»¸öattachView·½·¨£¬ÓÃÓÚ°ó¶¨ÎÒÃǶ¨ÒåµÄView¡£Ò²¾ÍÊÇ£¬ÄãÏë°ÑÇëÇóÏÂÀ´µÄÊý¾ÝʵÌåÀà¸øÄĸöView¾Í´«ÈëÄĸöView¡£ÏÂÃæÕâ¸öattachIncomingIntentÔÝÇÒûÓõ½£¬¾Í²»ËµÁË¡£ºÃÁË£¬ÎÒÃÇÀ´¿´Ò»ÏÂBook¾ßÌåÊÇÔõôʵÏֵģº

public class BookPresenter implements Presenter {
private DataManager manager;
private CompositeSubscription mCompositeSubscription;
private Context mContext;
private BookView mBookView;
private Book mBook;
public BookPresenter (Context mContext){
this.mContext = mContext;
}
@Override
public void onCreate() {
manager = new DataManager(mContext);
mCompositeSubscription = new CompositeSubscription();
}
@Override
public void onStart() {
}
@Override
public void onStop() {
if (mCompositeSubscription.hasSubscriptions()){
mCompositeSubscription.unsubscribe();
}
}
@Override
public void pause() {
}
@Override
public void attachView(View view) {
mBookView = (BookView)view;
}
@Override
public void attachIncomingIntent(Intent intent) {
}
public void getSearchBooks(String name,String

tag,int start,int count){
mCompositeSubscription.add(manager.getSearchBooks

(name,tag,start,count)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Book>() {
@Override
public void onCompleted() {
if (mBook != null){
mBookView.onSuccess(mBook);
}
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
mBookView.onError("ÇëÇóʧ°Ü£¡£¡");
}
@Override
public void onNext(Book book) {
mBook = book;
}
})
);
}
}

BookPresenterʵÏÖÁËÎÒÃǶ¨ÒåµÄ»ù´¡Presenter£¬ÔÚonCreateÖÐÎÒÃÇ´´½¨ÁËDataManagerµÄʵÌåÀ࣬±ãÓÚµ÷ÓÃeÖеķ½·¨£¬»¹Ð½¨ÁËÒ»¸öCompositeSubscription¶ÔÏó£¬CompositeSubscriptionÊÇÓÃÀ´´æ·ÅRxJavaÖеĶ©ÔĹØÏµµÄ¡£×¢ÒâÇëÇóÍêÊý¾ÝÒª¼°Ê±ÇåµôÕâ¸ö¶©ÔĹØÏµ£¬²»È»»á·¢ÉúÄÚ´æÐ¹Â©¡£¿ÉÔÚonStopÖÐͨ¹ýµ÷ÓõÄunsubscribe·½·¨À´È¡ÏûÕâ¸ö¶©ÔĹØÏµ£¬²»¹ýÒ»µ©µ÷ÓÃÕâ¸ö·½·¨£¬ÄÇôÕâ¸öÒ²¾ÍÎÞ·¨ÔÙÓÃÁË£¬ÒªÏëÔÙÓÃÖ»ÄÜÖØÐÂnewÒ»¸ö¡£È»ºóÎÒÃÇ¿ÉÒÔ¿´µ½ÔÚattachViewÖУ¬ÎÒÃǰѴ«½øÈ¥¡£Ò²¾ÍÊÇ˵ÎÒÃÇÒª°ÑÇëÇóÏÂÀ´µÄʵÌåÀཻ¸øBookViewÀ´´¦Àí¡£½ÓÏÂÀ´ÎÒÃǶ¨ÒåÁËÒ»¸ö·½·¨getSearchBooks£¬Ãû×ÖºÍÈë²Î¶¼ºÍÇëÇó½Ó¿ÚRetrofitServiceÖеķ½·¨Ïàͬ¡£ÕâÀïµÄÕâ¸ö·½·¨Ò²¾ÍÊÇÇëÇóµÄ¾ßÌåʵÏÖ¹ý³Ì¡£ÆäʵҲºÜ¼òµ¥£¬¾ÍÊÇÏòÌí¼ÓÒ»¸ö¶©ÔĹØÏµ¡£ÉÏÃæÎÒÃÇÒѾ­Ëµ¹ýmanager.getSearchBooks¾ÍÊǵ÷ÓÃRetrofitServiceµÄgetSearchBooks·½·¨£¬¶øÕâ¸ö·½·¨·µ»ØµÄÊÇÒ»¸ö·ºÐÍΪBookµÄObservable£¬¼´±»¹Û²ìÕߣ¬È»ºóͨ¹ý subscribeOnÀ´¶¨ÒåÇëÇóʼþ·¢ÉúÔÚioỊ̈߳¬È»ºóͨ¹ýÀ´¶¨ÒåʼþÔÚÖ÷Ïß³ÌÏû·Ñ£¬¼´ÔÚÖ÷Ï߳̽øÐÐÊý¾ÝµÄ´¦Àí£¬×îºóͨ¹ýsubscribeʹ¹Û²ìÕß¶©ÔÄËü¡£ÔÚ¹Û²ìÕßÖÐÓÐÈý¸ö·½·¨£ºonNext¡¢µ±ÇëÇó³É¹¦»°£¬¾Í»áµ÷ÓÃonNext£¬²¢´«ÈëÇëÇ󷵻صÄBookʵÌåÀ࣬ÎÒÃÇÔÚonNextÖУ¬°ÑÇëÇóÏÂÀ´µÄBookʵÌåÀà´æµ½ÄÚ´æÖУ¬µ±ÇëÇó½áÊøºó»áµ÷ÓÃonCompleted£¬ÎÒÃǰÑÇëÇóÏÂÀ´µÄBookʵÌåÀཻ¸øBookView´¦Àí¾Í¿ÉÒÔÁË£¬Èç¹ûÇëÇóʧ°Ü£¬ÄÇô²»»áµ÷ÓÃonCompleted¶øµ÷ÓÃonError£¬ÕâÑùÎÒÃÇ¿ÉÒÔÏòBookView´«µÝ´íÎóÏûÏ¢¡£

ºÃÁË£¬ÕâÑùÎÒÃÇÎÒÃǾͿÉÒÔµ÷ÓÃÕâ¸ö½Ó¿Ú·½·¨À´½øÐÐÍøÂçµÄÇëÇóÁË£¬ÎÒÃÇÏÈдһÏÂÒ³ÃæµÄ²¼¾Ö£º

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com

/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical

_margin"android:paddingLeft="@dimen/activity

_horizontal_margin"android:paddingRight="@dimen

/activity_horizontal_margin"android:orientatio

n="vertical"android:paddingTop="@dimen/acti

vity_vertical_margin"><TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<Button
android:id="@+id/button"
android:onClick="getFollowers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ÇëÇó"/>
</LinearLayout>

½çÃæºÜ¼òµ¥£¬Ò»¹²Á½¸ö¿Ø¼þ£¬Ò»¸öButton£¬µã»÷ʱ½øÐÐÍøÂçÇëÇó£¬Ò»¸öTextView£¬ÓÃÓÚÏÔʾÇëÇóÏÂÀ´µÄÊý¾Ý¡£È»ºóÎÒô¿´Ò»ÏÂActivityÖдúÂ룺

public class MainActivity extends AppCompatActivity {
private TextView text;
private Button button;
private BookPresenter mBookPresenter = new BookPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView)findViewById(R.id.text);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBookPresenter.getSearchBooks("½ðƿ÷", null, 0, 1);
}
});
mBookPresenter.onCreate();
mBookPresenter.attachView(mBookView);
}
private BookView mBookView = new BookView() {
@Override
public void onSuccess(Book mBook) {
text.setText(mBook.toString());
}
@Override
public void onError(String result) {
Toast.makeText(MainActivity.this,result, Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onDestroy(){
super.onDestroy();
mBookPresenter.onStop();
}
}

Âß¼­²¢²»¸´ÔÓ£¬ÎÒÃÇÏÈ´´½¨ÁËÒ»¸öBookPresenter ¶ÔÏó£¬È»ºóµ÷ÓÃËüµÄonCreate·½·¨½øÐгõʼ»¯£¬½Ó×ŵ÷attachViewÀ´°ó¶¨BookView¡£BookViewµÄʵÏÖÒ²ºÜ¼òµ¥£¬ÔÚonSuccess·½·¨Öн«Book ÖÐÄÚÈÝÏÔʾÔÚTextViewÉÏ£¬ÔÚonErrorÖе¯³öÒ»¸öToastÌáʾ¡£È»ºóµã»÷°´Å¥µÄʱºò¾Íµ÷ÓÃBookPresenterÖÐgetSearchBooks·½·¨£¬Í¬Ê±´«Èë±ØÒªµÄÈë²Î¡£ÕâÑùÍøÂçÇëÇó¾Í¿ªÊ¼ÁË£¬Èç¹ûÇëÇó³É¹¦¾Í»á»Øµ÷BookView ÖеÄonSuccess·½·¨£¬Ê§°Ü¾Í»Øµ÷onError·½·¨¡£µ±»î¶¯Ïú»Ùʱ¼ÇµÃµ÷ÓÃrµÄonStop·½·¨À´ÊͷŶ©ÔĹØÏµ£¬·ÀÖ¹ÄÚ´æÐ¹Â©¡£

×îºó±ðÍüÁËÔÚAndroidManifestÖÐÌí¼ÓÍøÂçȨÏÞ£º

<uses-permission android:name="android.permission.INTERNET"/>

ºÃÁË£¬ÎÒÃÇÔËÐÐһϿ´Ò»ÏÂЧ¹û£º

 

   
3285 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì