±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬ÕâÆªÎÄÕÂÖ÷ÒªÏêϸÐðÊöÁË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"/> |
ºÃÁË£¬ÎÒÃÇÔËÐÐһϿ´Ò»ÏÂЧ¹û£º

|