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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÈçºÎ¹¹½¨Android MVVMÓ¦ÓóÌÐò
 
×÷ÕߣºKelin ·¢²¼ÓÚ£º 2017-1-13
  1683  次浏览      27
 

1¡¢¸ÅÊö

Databinding ÊÇÒ»ÖÖ¿ò¼Ü£¬MVVMÊÇÒ»ÖÖģʽ£¬Á½ÕߵĸÅÄîÊDz»Ò»ÑùµÄ¡£ÎÒµÄÀí½âDataBindingÊÇÒ»¸öʵÏÖÊý¾ÝºÍUI°ó¶¨µÄ¿ò¼Ü£¬Ö»ÊÇÒ»¸öʵÏÖMVVMģʽµÄ¹¤¾ß¡£ViewModelºÍView¿ÉÒÔͨ¹ýDataBindingÀ´ÊµÏÖµ¥Ïò°ó¶¨ºÍË«Ïò°ó¶¨£¬ÕâÌ×UIºÍÊý¾ÝÖ®¼äµÄ¶¯Ì¬¼àÌýºÍ¶¯Ì¬¸üеĿò¼ÜGoogleÒѾ­°ïÎÒÃÇ×öºÃÁË¡£ÔÚMVVMģʽÖÐViewModelºÍViewÊÇÓð󶨹ØÏµÀ´ÊµÏֵģ¬ËùÒÔÓÐÁËDataBinding ʹÎÒÃǹ¹½¨Android MVVM Ó¦ÓóÌÐò³ÉΪ¿ÉÄÜ¡£

֮ǰ¿´ÁËºÜ¶à¹ØÓÚDataBindingµÄ²©¿ÍºÍÏà¹ØµÄһЩDemo£¬´ó¶àÊý¾ÍÊÇÍùxml²¼¾ÖÎļþ´«ÈëһЩÊý¾Ý£¬È»ºó°ÑÕâЩÊý¾Ý°ó¶¨µ½¿Ø¼þÉÏ( ÈçTextView binding:text=¡°@{user.name} )£¬½Ó×ÅÔÚÕâЩ¿Ø¼þÉÏ£¨ÈçButton binding:setOnClickListener="@{user.listener}") ÉèÖÃһЩʼþµ½¿Ø¼þÉÏ£¬»ù±¾½²Êö¶¼ÊÇDataBindingµÄ»ù±¾Ó÷¨¡£µ«ÊDz¢Ã»ÓÐÈ˸æËßÄã°ÑÒ»¸öonClickListener дµ½Ò»¸öÀಢ°ÑÕâ¸ölistener°ó¶¨µ½xmlÀïÃæÉÏÊDz»ÊDz»Ì«ºÃ£¬Ò²Ã»ÓÐÈ˸æËßÄãÕâ¸öºÍxml²¼¾Ö°ó¶¨µÄViewModelÀàÓ¦¸Ã·ÅÄÄЩÊý¾Ý£¬Ó¦¸Ã×öʲôÊ£¿Ó¦¸ÃÈçºÎÉè¼Æ£¿¸üÊǺÜÉÙÓв©ÎÄÀ´¸æËßÄãÔÚAndroid ÖÐÈçºÎͨ¹ýData Binding È¥¹¹½¨MVVM µÄÓ¦Óÿò¼Ü¡£ÕâÒ²¾ÍÊÇÊDZ¾ÆªÎÄÕµÄÖØµã¡£½ÓÏÂÀ´£¬ÎÒÃÇÏÈÀ´¿´¿´Ê²Ã´ÊÇMVVM£¬È»ºóÔÚÒ»²½Ò»²½À´Éè¼ÆÕû¸öÓ¦ÓóÌÐò¿ò¼Ü¡£

Ô´ÂëµØÖ·: https://github.com/Kelin-Hong/MVVMLight

2¡¢MVC¡¢MVP¡¢MVVM

Ê×ÏÈ£¬ÎÒÃÇÏÈ´óÖÂÁ˽âAndroid¿ª·¢Öг£¼ûµÄģʽ,ÒÔ±ãÎÒÃǸüÉîÈëÁ˽âMVVM ģʽ¡£

MVC

View£º¶ÔÓ¦ÓÚxml²¼¾ÖÎļþ

Model£ºÊµÌåÄ£ÐÍ

Controllor£º¶ÔÓ¦ÓÚActivityÒµÎñÂß¼­£¬Êý¾Ý´¦ÀíºÍUI´¦Àí

´ÓÉÏÃæ¿´ÆðÀ´¸÷¸ö×é¼þµÄÖ°ÔðÊÓºõ»¹Í¦ñîºÏMVCµÄ£¬µ«ÊÇ´ò¿ªAndroidµÄÒ»¸öActivityÎļþ£¬Ò»¿´Ò»ÑÔÄѾ¡£¬ AndroidÖо­³£»á³öÏÖÊýǧÐеÄActivity´úÂ룬¾¿ÆäÔ­Òò£¬AndroidÖд¿´â×÷ΪViewµÄ¸÷¸öXMLÊÓͼ¹¦ÄÜÌ«Èõ£¬Activity»ù±¾É϶¼ÊÇViewºÍControllerµÄºÏÌ壬¼ÈÒª¸ºÔðÊÓͼµÄÏÔʾÓÖÒª¼ÓÈë¿ØÖÆÂß¼­£¬³Ðµ£µÄ¹¦Äܹý¶à£¬´úÂëÁ¿´óÒ²¾Í²»×ãÎªÆæ¡£ËùÓиüÌùÇеÄĿǰ³£¹æµÄ¿ª·¢ËµÓ¦¸ÃÊÇView-Model ģʽ£¬´ó²¿·Ö¶¼ÊÇͨ¹ýActivityµÄЭµ÷£¬Á¬½Ó£¬ºÍ´¦ÀíÂß¼­µÄ¡£

MVP

View: ¶ÔÓ¦ÓÚActivityºÍxml£¬¸ºÔðViewµÄ»æÖÆÒÔ¼°ÓëÓû§½»»¥

Model: ÒÀÈ»ÊÇʵÌåÄ£ÐÍ

Presenter: ¸ºÔðÍê³ÉViewÓÚModel¼äµÄ½»»¥ºÍÒµÎñÂß¼­

ÔÚAndroid¿ª·¢ÖÐMVPµÄÉè¼ÆË¼ÏëÓõñȽ϶࣬ÀûÓÃMVPµÄÉè¼ÆÄ£ÐÍ¿ÉÒ԰Ѳ¿·ÖµÄÂß¼­µÄ´úÂë´ÓFragmentºÍActivityÒµÎñµÄÂß¼­ÒƳöÀ´£¬ÔÚPresenterÖгÖÓÐView£¨Activity»òÕßFragment£©µÄÒýÓã¬È»ºóÔÚPresenterµ÷ÓÃView±©Â¶µÄ½Ó¿Ú¶ÔÊÓͼ½øÐвÙ×÷£¬ÕâÑùÓÐÀûÓÚ°ÑÊÓͼ²Ù×÷ºÍÒµÎñÂß¼­·Ö¿ªÀ´¡£MVPÄܹ»ÈÃActivity³ÉÎªÕæÕýµÄView¶ø²»ÊÇViewºÍControlµÄºÏÌ壬ActivityÖ»×öUIÏà¹ØµÄÊ¡£µ«ÊÇÕâ¸öģʽ»¹ÊÇ´æÔÚһЩ²»ºÃµÄµØ·½£¬±È½ÏÈç˵£º

1.ActivityÐèҪʵÏÖ¸÷ÖÖ¸úUIÏà¹ØµÄ½Ó¿Ú£¬Í¬Ê±ÒªÔÚActivityÖбàд´óÁ¿µÄʼþ£¬È»ºóÔÚʼþ´¦ÀíÖе÷ÓÃpresenterµÄÒµÎñ´¦Àí·½·¨£¬ViewºÍPresenterÖ»ÊÇ»¥Ïà³ÖÓÐÒýÓò¢»¥Ïà×ö»Øµ÷,´úÂë²»ÃÀ¹Û¡£

2.ÕâÖÖģʽÖУ¬³ÌÐòµÄÖ÷½ÇÊÇUI£¬Í¨¹ýUIʼþµÄ´¥·¢¶ÔÊý¾Ý½øÐд¦Àí£¬¸üÐÂUI¾ÍÓп¼ÂÇÏ̵߳ÄÎÊÌâ¡£¶øÇÒUI¸Ä±äºóÇ£³¶µÄÂß¼­ñîºÏ¶ÈÌ«¸ß£¬Ò»µ©¿Ø¼þ¸ü¸Ä£¨±È½ÏTextView Ìæ»» EditTextµÈ£©Ç£³¶µÄ¸üÐÂUIµÄ½Ó¿Ú¾Í±ØÐëµÃ»»¡£

3.¸´ÔÓµÄÒµÎñͬʱ»áµ¼ÖÂpresenter²ãÌ«´ó£¬´úÂëÓ·Ö×µÄÎÊÌâ¡£

MVVM

View: ¶ÔÓ¦ÓÚActivityºÍxml£¬¸ºÔðViewµÄ»æÖÆÒÔ¼°ÓëÓû§½»»¥

Model: ʵÌåÄ£ÐÍ

ViewModel: ¸ºÔðÍê³ÉViewÓÚModel¼äµÄ½»»¥,¸ºÔðÒµÎñÂß¼­

MVVMµÄÄ¿±êºÍ˼ÏëMVPÀàËÆ£¬ÀûÓÃÊý¾Ý°ó¶¨(Data Binding)¡¢ÒÀÀµÊôÐÔ(Dependency Property)¡¢ÃüÁî(Command)¡¢Â·ÓÉʼþ(Routed Event)µÈÐÂÌØÐÔ£¬´òÔìÁËÒ»¸ö¸ü¼ÓÁé»î¸ßЧµÄ¼Ü¹¹¡£

Êý¾ÝÇý¶¯

ÔÚMVVMÖУ¬ÒÔǰ¿ª·¢Ä£Ê½ÖбØÐëÏÈ´¦ÀíÒµÎñÊý¾Ý£¬È»ºó¸ù¾ÝµÄÊý¾Ý±ä»¯£¬È¥»ñÈ¡UIµÄÒýÓÃÈ»ºó¸üÐÂUI£¬Í¨¹ýÒ²ÊÇͨ¹ýUIÀ´»ñÈ¡Óû§ÊäÈ룬¶øÔÚMVVMÖУ¬Êý¾ÝºÍÒµÎñÂß¼­´¦ÓÚÒ»¸ö¶ÀÁ¢µÄView ModelÖУ¬ViewModelÖ»Òª¹Ø×¢Êý¾ÝºÍÒµÎñÂß¼­£¬²»ÐèÒªºÍUI»òÕ߿ؼþ´ò½»µÀ¡£ÓÉÊý¾Ý×Ô¶¯È¥Çý¶¯UIÈ¥×Ô¶¯¸üÐÂUI£¬UIµÄ¸Ä±äÓÖͬʱ×Ô¶¯·´À¡µ½Êý¾Ý£¬Êý¾Ý³ÉΪÖ÷µ¼ÒòËØ£¬ÕâÑùʹµÃÔÚÒµÎñÂß¼­´¦ÀíÖ»Òª¹ØÐÄÊý¾Ý£¬·½±ã¶øÇÒ¼òµ¥ºÜ¶à¡£

µÍñîºÏ¶È

MVVMģʽÖУ¬Êý¾ÝÊǶÀÁ¢ÓÚUIµÄ£¬ViewModelÖ»¸ºÔð´¦ÀíºÍÌṩÊý¾Ý£¬UIÏëÔõô´¦ÀíÊý¾Ý¶¼ÓÉUI×Ô¼º¾ö¶¨£¬ViewModel ²»Éæ¼°ÈκκÍUIÏà¹ØµÄÊÂÒ²²»³ÖÓÐUI¿Ø¼þµÄÒýÓ㬼´Ê¹¿Ø¼þ¸Ä±ä£¨TextView »»³É EditText£©ViewModel ¼¸ºõ²»ÐèÒª¸ü¸ÄÈκδúÂ룬רע×Ô¼ºµÄÊý¾Ý´¦Àí¾Í¿ÉÒÔÁË£¬Èç¹ûÊÇMVPÓöµ½UI¸ü¸Ä£¬¾Í¿ÉÄÜÐèÒª¸Ä±ä»ñÈ¡UIµÄ·½Ê½£¬¸Ä±ä¸üÐÂUIµÄ½Ó¿Ú£¬¸Ä±ä´ÓUIÉÏ»ñÈ¡ÊäÈëµÄ´úÂ룬¿ÉÄÜ»¹ÐèÒª¸ü¸Ä·ÃÎÊUI¶ÔÏóµÄÊôÐÔ´úÂëµÈµÈ¡£

¸üÐÂUI

ÔÚMVVMÖУ¬ÎÒÃÇ¿ÉÒÔÔÚ¹¤×÷Ïß³ÌÖÐÖ±½ÓÐÞ¸ÄView ModelµÄÊý¾Ý£¨Ö»ÒªÊý¾ÝÊÇḬ̈߳²È«µÄ£©£¬Ê£ÏµÄÊý¾Ý°ó¶¨¿ò¼Ü°ïÄã¸ã¶¨£¬ºÜ¶àÊÂÇé¶¼²»ÐèÒªÄãÈ¥¹ØÐÄ¡£

ÍŶÓЭ×÷

MVVMµÄ·Ö¹¤ÊǷdz£Ã÷ÏԵģ¬ÓÉÓÚViewºÍView ModelÖ®¼äÊÇËÉÉ¢ñîºÏµÄ¡£Ò»¸öÊÇ´¦ÀíÒµÎñºÍÊý¾Ý£¬Ò»¸öÊÇרÃŵÄUI´¦Àí¡£ÍêÈ«ÓÐÁ½¸öÈË·Ö¹¤À´×ö£¬Ò»¸ö×öUI£¨xml ºÍ Activity£©Ò»¸öдViewModel£¬Ð§Âʸü¸ß¡£

¿É¸´ÓÃÐÔ

Ò»¸öView Model¸´Óõ½¶à¸öViewÖУ¬Í¬ÑùµÄÒ»·ÝÊý¾Ý£¬Óò»Í¬µÄUIÈ¥×öչʾ£¬¶ÔÓÚ°æ±¾µü´úƵ·±µÄUI¸Ä¶¯£¬Ö»Òª¸ü»»View²ã¾ÍÐУ¬¶ÔÓÚÈç¹ûÏëÔÚUIÉϵÄ×öAbTest ¸üÊÇ·½±ãµÄ¶à¡£

µ¥Ôª²âÊÔ

View ModelÀïÃæÊÇÊý¾ÝºÍÒµÎñÂß¼­£¬ViewÖйØ×¢µÄÊÇUI£¬ÕâÑùµÄ×ö²âÊÔÊǺܷ½±ãµÄ£¬ÍêȫûÓб˴˵ÄÒÀÀµ£¬²»¹ÜÊÇUIµÄµ¥Ôª²âÊÔ»¹ÊÇÒµÎñÂß¼­µÄµ¥Ôª²âÊÔ£¬¶¼ÊǵÍñîºÏµÄ¡£

ͨ¹ýÉÏÃæ¶ÔMVVMµÄ¼òÊöºÍÆäËûÁ½ÖÖģʽµÄ¶Ô±È£¬ÎÒÃÇ·¢ÏÖMVVM¶Ô±ÈMVCºÍMVPÀ´Ëµ»¹ÊÇ´æÔڱȽϴóµÄÓÅÊÆ£¬ËäȻĿǰAndroid¿ª·¢ÖпÉÄÜÕæÕýÔÚʹÓÃMVVMµÄºÜÉÙ£¬µ«ÊÇÊÇÖµµÃÎÒÃÇÈ¥×öһЩ̽Ìֺ͵÷ÑС£

3¡¢ÈçºÎ¹¹½¨MVVMÓ¦ÓóÌÐò

1. ÈçºÎ·Ö¹¤

¹¹½¨MVVM¿ò¼ÜÊ×ÏÈÒª¾ßÌåÁ˽â¸÷¸öÄ£¿éµÄ·Ö¹¤£¬½ÓÏÂÀ´ÎÒÃÇÀ´½²½âView£¬ViewModel£¬Model µÄËüÃǸ÷×ÔµÄÖ°ÔðËùÔÚ¡£

View

View²ã×öµÄ¾ÍÊǺÍUIÏà¹ØµÄ¹¤×÷£¬ÎÒÃÇÖ»ÔÚXMLºÍActivity»òFragmentдView²ãµÄ´úÂ룬View²ã²»×öºÍÒµÎñÏà¹ØµÄÊ£¬Ò²¾ÍÊÇÎÒÃǵÄActivity ²»Ð´ºÍÒµÎñÂß¼­Ïà¹Ø´úÂ룬Ҳ²»Ð´ÐèÒª¸ù¾ÝÒµÎñÂß¼­À´¸üÐÂUIµÄ´úÂ룬ÒòΪ¸üÐÂUIͨ¹ýBindingʵÏÖ£¬¸üÐÂUIÔÚViewModelÀïÃæ×ö£¨¸üа󶨵ÄÊý¾ÝÔ´¼´¿É£©£¬Activity Òª×öµÄʾÍÊdzõʼ»¯Ò»Ð©¿Ø¼þ£¨Èç¿Ø¼þµÄÑÕÉ«£¬Ìí¼Ó RecyclerView µÄ·Ö¸îÏߣ©£¬Activity¿ÉÒÔ¸üÐÂUI£¬µ«ÊǸüеÄUI±ØÐëºÍÒµÎñÂß¼­ºÍÊý¾ÝÊÇûÓйØÏµµÄ£¬Ö»Êǵ¥´¿µÄ¸ù¾Ýµã»÷»òÕß»¬¶¯µÈʼþ¸üÐÂUI(Èç ¸ù¾Ý»¬¶¯ÑÕÉ«½¥±ä¡¢¸ù¾Ýµã»÷Òþ²ØµÈµ¥´¿UIÂß¼­)£¬Activity£¨View²ã£©ÊÇ¿ÉÒÔ´¦ÀíUIʼþ£¬µ«ÊÇ´¦ÀíµÄÖ»ÊÇ´¦ÀíUI×Ô¼ºµÄÊÂÇ飬View²ãÖ»´¦ÀíView²ãµÄÊ¡£¼òµ¥µÄ˵£ºView²ã²»×öÈκÎÒµÎñÂß¼­¡¢²»Éæ¼°²Ù×÷Êý¾Ý¡¢²»´¦ÀíÊý¾Ý¡¢UIºÍÊý¾ÝÑϸñµÄ·Ö¿ª¡£

ViewModel

ViewModel²ã×öµÄÊÂÇé¸ÕºÃºÍView²ãÏà·´£¬ViewModel Ö»×öºÍÒµÎñÂß¼­ºÍÒµÎñÊý¾ÝÏà¹ØµÄÊ£¬²»×öÈκκÍUI¡¢¿Ø¼þÏà¹ØµÄÊ£¬ViewModel ²ã²»»á³ÖÓÐÈκοؼþµÄÒýÓ㬸ü²»»áÔÚViewModelÖÐͨ¹ýUI¿Ø¼þµÄÒýÓÃÈ¥×ö¸üÐÂUIµÄÊÂÇé¡£ViewModel¾ÍÊÇרעÓÚÒµÎñµÄÂß¼­´¦Àí£¬²Ù×÷µÄÒ²¶¼ÊǶÔÊý¾Ý½øÐвÙ×÷£¬ÕâЩ¸öÊý¾ÝÔ´°ó¶¨ÔÚÏàÓ¦µÄ¿Ø¼þÉÏ»á×Ô¶¯È¥¸ü¸ÄUI£¬¿ª·¢Õß²»ÐèÒª¹ØÐĸüÐÂUIµÄÊÂÇé¡£DataBinding ¿ò¼ÜÒѾ­Ö§³ÖË«Ïò°ó¶¨£¬ÕâʹµÃÎÒÃÇÔÚ¿ÉÒÔͨ¹ýË«Ïò°ó¶¨»ñÈ¡View²ã·´À¡¸øViewModel²ãµÄÊý¾Ý£¬²¢½øÐвÙ×÷¡£¹ØÓÚ¶ÔUI¿Ø¼þʼþµÄ´¦Àí£¬ÎÒÃÇҲϣÍûÄܰÑÕâЩʼþ´¦Àí°ó¶¨µ½¿Ø¼þÉÏ£¬²¢°ÑÕâЩʼþͳһ»¯£¬·½±ãViewModel¶ÔʼþµÄ´¦ÀíºÍ´úÂëµÄÃÀ¹Û¡£Îª´ËÎÒÃÇͨ¹ýBindingAdapter ¶ÔһЩ³£ÓõÄʼþ×öÁË·â×°£¬°ÑÒ»¸ö¸öʼþ·â×°³ÉÒ»¸ö¸öCommand£¬¶ÔÓÚÿ¸öʼþÎÒÃÇÓÃÒ»¸öReplyCommand<T>È¥´¦Àí¾ÍÐÐÁË,ReplyCommand<T>»á°Ñ¿ÉÄÜÄãÐèÒªµÄÊý¾Ý´ø¸øÄ㣬ÕâʹµÃÎÒÃÇ´¦ÀíʼþµÄʱºòÒ²Ö»¹ØÐÄ´¦ÀíÊý¾Ý¾ÍÐÐÁË£¬¾ßÌå¼ûMVVM Light Toolkit ʹÓÃÖ¸Ä쵀 Command ²¿·Ö¡£ÔÙÇ¿µ÷Ò»±éViewModel ²»×öºÍUIÏà¹ØµÄÊ¡£

Model

Model µÄÖ°ÔðºÜ¼òµ¥£¬»ù±¾¾ÍÊÇʵÌåÄ£ÐÍ£¨Bean£©Í¬Ê±°üÀ¨Retrofit µÄService £¬ViewModel ¿ÉÒÔ¸ù¾ÝModel »ñȡһ¸öBeanµÄObservable<Bean>( RxJava ),È»ºó×öһЩÊý¾Ýת»»²Ù×÷ºÍÓ³Éäµ½ViewModel ÖеÄһЩ×ֶΣ¬×îºó°ÑÕâЩ×ֶΰ󶨵½View²ãÉÏ¡£

2. ÈçºÎЭ×÷

¹ØÓÚЭ×÷£¬ÎÒÃÇÏÈÀ´¿´ÏÂÃæµÄÒ»ÕÅͼ£º

ͼ1

ÉÏͼ·´Ó¦ÁËMVVM¿ò¼ÜÖи÷¸öÄ£¿éµÄÁªÏµºÍÊý¾ÝÁ÷µÄ×ßÏò£¬ÓÉÉÏͼ¿ÉÖªViewºÍModel Ö±½ÓÊǽâñîµÄ£¬ÊÇûÓÐÖ±½ÓÁªÏµµÄ£¬Ò²¾ÍÊÇÎÒ֮ǰ˵µ½µÄView ²»×öÈκκÍÒµÎñÂß¼­ºÍÊý¾Ý´¦ÀíÏà¹ØµÄÊ¡£ÎÒÃÇ´Óÿ¸öÄ£¿éÒ»Ò»²ð·ÖÀ´¿´¡£ÄÇôÎÒÃÇÖØµã¾ÍÊÇÏÂÃæµÄÈý¸öЭ×÷¡£

1.ViewModelÓëViewµÄЭ×÷

2.ViewModelÓëModelµÄЭ×÷

3.ViewModelÓëViewModelµÄЭ×÷

ViewModelÓëViewµÄЭ×÷

ͼ2

ͼ2ÖÐViewModelºÍViewÊÇͨ¹ý°ó¶¨µÄ·½Ê½Á¬½ÓÔÚÒ»ÆðµÄ£¬°ó¶¨µÄÒ»ÖÖÊÇÊý¾Ý°ó¶¨£¬Ò»ÖÖÊÇÃüÁî°ó¶¨¡£Êý¾ÝµÄ°ó¶¨ DataBinding ÒѾ­ÌṩºÃÁË£¬¼òµ¥µÄ¶¨ÒåһЩObservableField¾ÍÄܰÑÊý¾ÝºÍ¿Ø¼þ°ó¶¨ÔÚÒ»ÆðÁË£¨ÈçTextViewµÄtextÊôÐÔ£©£¬µ«ÊÇDataBinding¿ò¼ÜÌṩµÄ²»¹»È«Ã棬±ÈÈç˵ÈçºÎÈÃÒ»¸öURL°ó¶¨µ½Ò»¸öImageViewÈÃÕâ¸öImageViewÄÜ×Ô¶¯È¥¼ÓÔØurlÖ¸¶¨µÄͼƬ£¬ÈçºÎ°ÑÊý¾ÝÔ´ºÍ²¼¾ÖÄ£°å°ó¶¨µ½Ò»¸öListView£¬ÈÃListView¿ÉÒÔ²»ÐèҪȥдAdapterºÍViewHolder Ïà¹ØµÄ¶«Î÷£¬¶øÖ»ÊÇͨ¹ý¼òµ¥µÄ°ó¶¨µÄ·½Ê½°ÑViewModelµÄÊý¾ÝÔ´°ó¶¨µ½XmlµÄ¿Ø¼þÀïÃæ¾ÍÄÜ¿ìËÙµÄչʾÁбíÄØ£¿ÕâЩ¾ÍÐèÒªÎÒÃÇ×öһЩ¹¤×÷ºÍ¼òµ¥µÄ·â×°¡£MVVM Light Toolkit ÒѾ­°ïÎÒÃÇ×öÁËÒ»²¿·ÖµÄ¹¤×÷£¬ÏêÇé¿ÉÒԲ鿴MVVM Light Toolkit ʹÓÃÖ¸ÄÏ¡£¹ØÓÚʼþ°ó¶¨Ò²ÊÇÒ»Ñù£¬MVVM Light Toolkit ×öÁ˼òµ¥µÄ·â×°£¬¶ÔÓÚÿ¸öʼþÎÒÃÇÓÃÒ»¸öReplyCommand<T>È¥´¦Àí¾ÍÐÐÁË,ReplyCommand<T>»á°Ñ¿ÉÄÜÄãÐèÒªµÄÊý¾Ý´ø¸øÄ㣬ÕâʹµÃÎÒÃÇ´¦ÀíʼþµÄʱºòÒ²Ö»¹ØÐÄ´¦ÀíÊý¾Ý¾ÍÐÐÁË¡£

ÓÉͼ1ÖÐViewModelµÄÄ£¿éÖÐÎÒÃÇ¿ÉÒÔ¿´³öViewModelÀàÏÂÃæÒ»°ã°üº¬ÏÂÃæ5¸ö²¿·Ö£º

1.Context £¨ÉÏÏÂÎÄ£©

2.Model (Êý¾ÝÄ£ÐÍBean)

3.Data Field £¨Êý¾Ý°ó¶¨£©

4.Command £¨ÃüÁî°ó¶¨£©

5.Child ViewModel £¨×ÓViewModel£©

ÎÒÃÇÏÈÀ´¿´ÏÂʾÀý´úÂ룬ȻºóÔÚÒ»Ò»½²½â5¸ö²¿·ÖÊǸÉÂïÓõģº

//context
private Activity context;

//model£¨Êý¾ÝÄ£ÐÍBean£©
private NewsService.News news;
private TopNewsService.News topNews;

//Êý¾Ý°ó¶¨£¨data field£©
public final ObservableField<String> imageUrl = new ObservableField<>();
public final ObservableField<String> html = new ObservableField<>();
public final ObservableField<String> title = new ObservableField<>();
// Ò»¸ö±äÁ¿°üº¬ÁËËùÓйØÓÚView Style Ïà¹ØµÄ×Ö¶Î
public final ViewStyle viewStyle = new ViewStyle();


//ÃüÁî°ó¶¨£¨command£©
public final ReplyCommand onRefreshCommand = new ReplyCommand<>(() -> {

})
public final ReplyCommand<Integer> onLoadMoreCommand = new ReplyCommand<>((p) -> {

});


//Child ViewModel
public final ObservableList<NewItemViewModel> itemViewModel = new ObservableArrayList<>();

/** * ViewStyle ¹ØÓڿؼþµÄһЩÊôÐÔºÍÒµÎñÊý¾ÝÎ޹صÄStyle ¿ÉÒÔ×öÒ»¸ö°ü¹ü£¬ÕâÑù´úÂë±È½ÏÃÀ¹Û£¬
ViewModel Ò³ÃæÒ²²»»áÓÐÌ«¶àµÄ×ֶΡ£ **/
public static class ViewStyle {
public final ObservableBoolean isRefreshing = new ObservableBoolean(true);
public final ObservableBoolean progressRefreshing = new ObservableBoolean(true);
}

Context

Context ÊǸÉÂïÓõÄÄØ£¬ÎªÊ²Ã´Ã¿¸öViewModel¶¼×îºÃÐèÒª³ÖÁËÒ»¸öContextµÄÒýÓÃÄØ£¿ViewModel ²»×öºÍUIÏà¹ØµÄÊ£¬²»²Ù×÷¿Ø¼þ£¬Ò²²»¸üÐÂUI£¬ÄÇΪʲôҪÓÐContextÄØ£¿Ô­ÒòÖ÷ÒªÓÐÒÔÏÂÁ½µã£¬µ±È»Ò²ÓÐÆäËûÓô¦£¬µ÷Óù¤¾ßÀà¡¢°ïÖúÀà¿ÉÄÜÐèÒªcontext²ÎÊýµÈ£º

ͨ¹ýͼ1ÖУ¬ÎÒÃÇ·¢ÏÖViewModel ͨ¹ý´«²Î¸øModel È»ºóµÃµ½Ò»¸öObservable<Bean>,ÆäʵÕâ¾ÍÊÇÍøÂçÇëÇ󲿷֣¬×öÍøÂçÇëÇóÎÒÃDZØÐë°ÑRetrofit Service·µ»ØµÄObservable<Bean>°ó¶¨µ½ContextµÄÉúÃüÖÜÆÚÉÏ£¬·ÀÖ¹ÔÚÇëÇó»ØÀ´Ê±ActivityÒѾ­Ïú»ÙµÈÒì³££¬ÆäʵÕâ¸öContextµÄÄ¿µÄ¾ÍÊǰÑÍøÂçÇëÇó°ó¶¨µ½µ±Ç°Ò³ÃæµÄÉúÃüÖÜÆÚÖС£

ÔÚͼ1ÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½Á½¸öViewModel Ö®¼äµÄÁªÏµÊÇͨ¹ýMessengerÀ´×ö£¬Õâ¸öMessenger ÊÇÐèÒªÓõ½Context£¬Õâ¸öÎÒÃǺóÐø»á½²½â¡£

Model

Model ÊÇÊ²Ã´ÄØ£¬Æäʵ¾ÍÊÇÊý¾ÝÔ­ÐÍ£¬Ò²¾ÍÊÇÎÒÃÇÓÃJsonת¹ýÀ´µÄJava Bean£¬ÎÒÃÇ¿ÉÄܶ¼ÖªµÀ£¬ViewModelÒª°ÑÊý¾ÝÓ³Éäµ½ViewÖпÉÄÜÐèÒª´óÁ¿¶ÔModelµÄÊý¾Ý¿½±´£¬ÄÃModel µÄ×Ö¶ÎÈ¥Éú³É¶ÔÓ¦µÄObservableField£¨ÎÒÃDz»»áÖ±½ÓÄÃModelµÄÊý¾ÝÈ¥×öչʾ£©£¬ÕâÀïÆäʵÊÇÓбØÒªÔÚÒ»¸öViewModel ±£ÁôԭʼµÄModelÒýÓã¬Õâ¶ÔÓÚÎÒÃÇÊǷdz£ÓÐÓõģ¬ÒòΪ¿ÉÄÜÓû§µÄijЩ²Ù×÷ºÍÊäÈëÐèÒªÎÒÃÇÈ¥¸Ä±äÊý¾ÝÔ´£¬¿ÉÄÜÎÒÃÇÐèÒª°ÑÒ»¸öBean ´ÓÁбíÒ³µã»÷ºó´«¸øÏêÇéÒ³£¬¿ÉÄÜÎÒÃÇÐèÒª°ÑÕâ¸ömodel µ±×ö±íµ¥Ìá½»µ½·þÎñÆ÷¡£ÕâЩ¶¼ÐèÒªÎÒÃǵÄViewModel³ÖÓÐÏàÓ¦µÄmodel¡£

Data Field £¨Êý¾Ý°ó¶¨£©

Data Field ¾ÍÊÇÐèÒª°ó¶¨µ½¿Ø¼þÉϵÄObservableField×ֶΣ¬ Î޿ɺñ·ÇÕâÊÇViewModelµÄ±ØÐëÆ·¡£Õâ¸öûÓÐʲôºÃ˵£¬µ«ÊÇÕâ±ßÓÐÒ»¸ö½¨Ò飺 ÕâЩ×Ö¶ÎÊÇ¿ÉÒÔÉÔ΢×öһϷÖÀàºÍ°ü¹üµÄ£¬±ÈÈç˵¿ÉÄÜһЩ×ֶΰ󶨵½¿Ø¼þµÄһЩStyleÊôÐÔÉÏ£¨Èç¹û˵£º³¤¶È£¬ÑÕÉ«£¬´óС£©ÕâЩ¸ù¾ÝÒµÎñÂß¼­µÄ±ä»¯¶ø¶¯Ì¬È¥¸ü¸ÄµÄ£¬¶ÔÓÚ×ÅÒ»ÀàÕë¶ÔView StyleµÄµÄ×ֶοÉÒÔÉùÃ÷Ò»¸öViewStyleÀà°ü¹üÆðÀ´£¬ÕâÑùÕû¸ö´úÂëÂß¼­»á¸üÇåÎúһЩ£¬²»È»ViewModelÀïÃæ¿ÉÄÜ×ֶηºÀÄ£¬²»Ò×¹ÜÀíºÍÔĶÁÐԽϲ¶ø¶ÔÓÚÆäËûһЩ×ֶΣ¬±ÈÈç˵title£¬imageUrl£¬nameÕâЩÊôÓÚÊý¾ÝÔ´ÀàÐ͵Ä×ֶΣ¬ÕâЩ×Ö¶ÎÒ²½ÐÊý¾Ý×ֶΣ¬ÊǺÍÒµÎñÂß¼­Ï¢Ï¢Ïà¹ØµÄ£¬ÕâЩ×ֶοÉÒÔ·ÅÔÚÒ»¿é

Command £¨ÃüÁî°ó¶¨£©

Command £¨ÃüÁî°ó¶¨£©Ëµ°×Á˾ÍÊǶÔʼþµÄ´¦Àí£¨ÏÂÀ­Ë¢Ð£¬¼ÓÔØ¸ü¶à£¬µã»÷£¬»¬¶¯µÈʼþ´¦Àí£©£¬ÎÒÃÇ֮ǰ´¦ÀíʼþÊÇÄõ½UI¿Ø¼þµÄÒýÓã¬È»ºóÉèÖÃListener£¬ÕâЩListener Æäʵ¾ÍÊÇCommand£¬µ«ÊÇ¿¼Âǵ½ÔÚÒ»¸öViewModel д¸÷ÖÖListener ²¢²»ÃÀ¹Û£¬¿ÉÄÜʵÏÖÒ»¸öListener¾ÍÐèҪʵÏÖ¶à¸ö·½·¨£¬µ«ÊÇÎÒÃÇ¿ÉÄÜÖ»ÏëÒªÆäÖÐÒ»¸öÓÐÓõķ½·¨ÊµÏ־ͺÃÁË¡£Í¬Ê±ÊµÏÖListener »áÄõ½UIµÄÒýÓ㬿ÉÄÜ»áÈ¥×öһЩºÍUIÏà¹ØµÄÊÂÇ飬ÕâºÍÎÒÃÇ֮ǰ˵µÄViewModel ²»³ÖÓпؼþµÄÒýÓã¬ViewModel²»¸ü¸ÄUI ÓÐÏà㣡£¸üÖØÒªÒ»µãÊÇʵÏÖÒ»¸öListener ¿ÉÄÜÐèҪдһЩUIÂß¼­²ÅÄÜ×îÖÕ»ñÈ¡ÎÒÃÇÏëÒªµÄ£¬¼òµ¥Ò»µãµÄ±ÈÈç˵£¬ÄãÏëÒª¼àÌýListView»¬µ½×îµ×²¿È»ºó´¥·¢¼ÓÔØ¸ü¶àµÄʼþ£¬ÕâʱºòÄã¾ÍÒªÔÚViewModelÀïÃæÐ´Ò»¸öOnScrollListener,È»ºóÔÚÀïÃæµÄonScroll·½·¨ÖÐ×ö¼ÆË㣬¼ÆËãʲôʱºòListView»¬¶¯µ×²¿ÁË£¬ÆäʵViewModelµÄ¹¤×÷²¢²»ÏëÈ¥´¦ÀíÕâЩʼþ£¬Ëüרע×öµÄÓ¦¸ÃÊÇÒµÎñÂß¼­ºÍÊý¾Ý´¦Àí£¬Èç¹ûÓÐÒ»¸ö¶«Î÷Ëü²»ÐèÒªÄã×Ô¼ºÈ¥¼ÆËãÊÇ·ñ»¬µ½µ×²¿£¬¶øÊÇÔÚ»¬¶¯µ×²¿×Ô¶¯´¥·¢Ò»¸öCommand£¬Í¬Ê±°Ñµ±Ç°ÁбíµÄ×ܹ²µÄitemÊýÁ¿·µ»Ø¸øÄ㣬·½±ãÄãͨ¹ý page=itemCount/LIMIT+1È¥¼ÆËã³öÓ¦¸ÃÇëÇó·þÎñÆ÷ÄÄÒ»Ò³µÄÊý¾ÝÄǸöàºÃ°¡¡£MVVM Light Toolkit °ïÄãʵÏÖÁËÕâÒ»µã£º

public final ReplyCommand<Integer> onLoadMoreCommand =  new ReplyCommand<>((itemCount) -> { 
int page=itemCount/LIMIT+1;
loadData(page.LIMIT)
});

½Ó×ÅÔÚXML ²¼¾ÖÎļþÖÐͨ¹ýbind:onLoadMoreCommand°ó¶¨ÉÏÈ¥¾ÍÐÐÁË

<android.support.v7.widget.RecyclerView 
android:layout_width="match_parent"
android:layout_height="match_parent"
bind:onLoadMoreCommand="@{viewModel.loadMoreCommand}"/>

¾ßÌåÏëÁ˽â¸ü¶àÇë²é¿´ MVVM Light Toolkit ʹÓÃÖ¸ÄÏ£¬ÀïÃæÓбȽÏÏêϸµÄ½²½âCommandµÄʹÓᣵ±È»Command²¢²»ÊDZØÐëµÄ£¬ÄãÍêÈ«¿ÉÒÔÒÀÕÕÄãµÄϰ¹ßºÍϲºÃÔÚViewModel дListener£¬²»¹ýʹÓÃCommand ¿ÉÒÔʹÄãµÄViewModel ¸ü¼ò½àÒ×¶Á£¬ÄãÒ²¿ÉÒÔ×Ô¼º¶¨Òå¸ü¶àµÄCommand£¬×Ô¼º¶¨ÒåÆäËû¹¦ÄÜCommand£¬ÄÇôViewModelµÄʼþ´¦Àí¶¼ÊÇÍйÜReplyCommand<T>À´´¦Àí£¬ÕâÑùµÄ´úÂë¿´ÆðÀ´»áÌØ±ðÃÀ¹ÛºÍÇåÎú¡£

Child ViewModel£¨×ÓViewModel£©

×ÓViewModel µÄ¸ÅÄî¾ÍÊÇÔÚViewModel ÀïÃæÇ¶ÌׯäËûµÄViewModel£¬ÕâÖÖ³¡¾°»¹ÊǺܳ£¼ûµÄ¡£±ÈÈç˵ÄãÒ»¸öActivityÀïÃæÓÐÁ½¸öFragment£¬ViewModel ÊÇÒÔÒµÎñ»®·ÖµÄ£¬Á½¸öFragment×öµÄÒµÎñ²»Ò»Ñù£¬×ÔÈ»ÊÇÓÉÁ½¸öViewModelÀ´´¦Àí£¬Activity ±¾Éí¿ÉÄܾÍÓиöViewModel À´×öËü×Ô¼ºµÄÒµÎñ£¬ÕâʱºòActivityµÄÕâ¸öViewModelÀïÃæ¿ÉÄܰüº¬ÁËÁ½¸öFragment·Ö±ðµÄViewModel¡£Õâ¾ÍÊÇǶÌ×µÄ×ÓViewModel¡£»¹ÓÐÁíÍâÒ»ÖÖ¾ÍÊǶÔÓÚAdapterView ÈçListView RecyclerView,ViewPagerµÈ¡£

//Child ViewModelpublic final 
ObservableList<ItemViewModel> itemViewModel = new ObservableArrayList<>();

ËüÃǵÄÿ¸öItem Æäʵ¾Í¶ÔÓ¦ÓÚÒ»¸öViewModel£¬È»ºóÔÚµ±Ç°µÄViewModel ͨ¹ýObservableList<ItemViewModel>³ÖÓÐÒýÓã¨ÈçÉÏÊö´úÂ룩£¬ÕâÒ²ÊǺܳ£¼ûµÄǶÌ×µÄ×ÓViewModel¡£ÎÒÃÇÆäʵ»¹½¨Ò飬Èç¹ûÒ»¸öÒ³ÃæÒµÎñ·Ç³£¸´ÔÓ£¬²»Òª°ÑËùÓÐÂß¼­¶¼Ð´ÔÚÒ»¸öViewModel£¬¿ÉÒÔ°ÑÒ³Ãæ×öÒµÎñ»®·Ö£¬°Ñ²»Í¬µÄÒµÎñ·Åµ½²»Í¬µÄViewModel£¬È»ºóÕûºÏµ½Ò»¸ö×ܵÄViewModel£¬ÕâÑù×öÆðÀ´¿ÉÒÔʹÎÒÃǵĴúÂëÒµÎñÇåÎú£¬¼ò¶ÌÒâê࣬Ҳ·½±ãºóÈ˵Äά»¤¡£

×ܵÃÀ´ËµViewModel ºÍView ֮ǰ½ö½öÖ»Óа󶨵ĹØÏµ£¬View²ãÐèÒªµÄÊôÐÔºÍʼþ´¦Àí¶¼ÊÇÔÚxmlÀïÃæ°ó¶¨ºÃÁË£¬ViewModel²ã²»»áÈ¥²Ù×÷UI£¬Ö»»á²Ù×÷Êý¾Ý£¬ViewModelÖ»ÊǸù¾ÝÒµÎñÒªÇó´¦ÀíÊý¾Ý£¬ÕâЩÊý¾Ý×Ô¶¯Ó³Éäµ½View²ã¿Ø¼þµÄÊôÐÔÉÏ¡£¹ØÓÚViewModelÀàÖаüº¬ÄÄЩģ¿éºÍ×ֶΣ¬Õâ¸öÐèÒª¿ª·¢Õß×Ô¼ºÈ¥ºâÁ¿£¬Õâ±ß½¨ÒéViewModel ²»ÒªÒýÈëÌ«¶àµÄ³ÉÔ±±äÁ¿£¬³ÉÔ±±äÁ¿×îºÃÖ»ÓÐÉÏÃæµÄÌáµ½µÄ5ÖÖ£¨context¡¢model¡¢...£©£¬Äܲ»½øÈëÆäËûÀàÐ͵ıäÁ¿¾Í¾¡Á¿²»ÒªÒý½øÀ´£¬Ì«¶àµÄ³ÉÔ±±äÁ¿¶ÔÓÚÕû¸ö´úÂë½á¹¹ÆÆ»µºÜ´ó£¬ºóÃæÎ¬»¤µÄÈËҪʱ¿Ì¹ØÐijÉÔ±±äÁ¿Ê²Ã´Ê±ºò±»³õʼ»¯£¬Ê²Ã´Ê±ºò±»Çåµô£¬Ê²Ã´Ê±ºò±»¸³Öµ»òÕ߸ı䣬һ¸öϸ½Ú²»Ð¡ÐÄ¿ÉÄܾͳöÏÖDZÔÚµÄBug¡£Ì«¶à²»ÇåÎú¶¨ÒåµÄ³ÉÔ±±äÁ¿ÓÖûÓÐ×¢Ê͵ĴúÂëÊǺÜÄÑά»¤µÄ¡£

2016Äê8ÔÂ25ÈÕ¸üУº

ÎÒÃÇ»á°ÑUI¿Ø¼þµÄÊôÐÔºÍʼþ¶¼Í¨¹ýxmlÀïÃæ£¨Èçbind£ºtext=@{...})°ó¶¨£¬µ«ÊÇÈç¹ûÒ»¸öÒµÎñÂß¼­Òªµ¯Ò»¸öDialog£¬µ«ÊÇÄãÓÖ²»ÏëÔÚViewModelÀïÃæ×öµ¯´°µÄÊ£¨ViewModel ²»×öUIÏà¹ØµÄÊ£©»òÕß˵¸Ä±äActionBarÉÏÃæµÄͼ±êµÄÑÕÉ«,¸Ä±äActionBar°´Å¥ÊÇ·ñ¿Éµã»÷£¬ÕâЩ¶¼²»ÊÇдÔÚxmlÀïÃæ£¨¶¼ÊÇÓÃjava ³õʼ»¯»°£©£¬ÈçºÎ¶ÔÕâЩ¿Ø¼þµÄÊôÐÔ×ö°ó¶¨ÄØ£¿ÎÒÃÇÏÈÀ´¿´Ï´úÂ룺

public class MainViewModel implements ViewModel {
....
//trueµÄʱºòµ¯³öDialog£¬falseµÄʱºò¹Øµôdialog
public final ObservableBoolean isShowDialog = new ObservableBoolean();
....
.....
}
// ÔÚView²ã×öÒ»¸ö¶ÔisShowDialog¸Ä±äµÄ¼àÌý
public class MainActivity extends RxBasePmsActivity {

private MainViewModel mainViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
.....
mainViewModel.isShowDialog.addOnPropertyChangedCallback(new android.databinding.Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(android.databinding.Observable sender, int propertyId) {
if (mainViewModel.isShowDialog.get()) {
dialog.show();
} else {
dialog.dismiss();
}
}
});
}
...
}
`

¼òµ¥µÄ˵Äã¿ÉÒÔ¶ÔÈÎÒâµÄObservableField×ö¼àÌý£¬È»ºó¸ù¾ÝÊý¾ÝµÄ±ä»¯×öÏàÓ¦UIµÄ¸Ä±ä£¬ÒµÎñ²ãViewModel Ö»Òª¸ù¾ÝÒµÎñ´¦ÀíÊý¾Ý¾ÍÐУ¬ÒÔÊý¾ÝÀ´Çý¶¯UI¡£

ViewModelÓëModelµÄЭ×÷

´Óͼ1ÖУ¬ModelÊÇͨ¹ýRetrofitÈ¥»ñÈ¡ÍøÂçÊý¾ÝµÄ£¬·µ»ØµÄÊý¾ÝÊÇÒ»¸öObservable<Bean>( RxJava ),Model ²ãÆäʵ×öµÄ¾ÍÊÇÕâЩ¡£ÄÇôViewModel ×öµÄ¾ÍÊÇͨ¹ý´«²ÎÊýµ½Model²ã»ñÈ¡µ½ÍøÂçÊý¾Ý£¨Êý¾Ý¿âͬÀí£©È»ºó°ÑModelµÄ²¿·ÖÊý¾ÝÓ³Éäµ½ViewModelµÄһЩ×ֶΣ¨ObservableField£©£¬²¢ÔÚViewModel ±£ÁôÕâ¸öModelµÄÒýÓÃ,ÎÒÃÇÀ´¿´ÏÂÕâÒ»¿éµÄ´óÖ´úÂë(´úÂëÉæ¼°µ½¼òµ¥RxJava£¬Èç¿´²»¶®¿ÉÒÔ²éÔÄÈëÃÅÒ»ÏÂ)£º

//Model
private NewsDetail newsDetail;

private void loadData(long id) {
// Observable<Bean> ÓÃÀ´»ñÈ¡ÍøÂçÊý¾Ý
Observable<Notification<NewsDetailService.NewsDetail>> newsDetailOb =
RetrofitProvider.getInstance()
.create(NewsDetailService.class)
.getNewsDetail(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// ½«ÍøÂçÇëÇó°ó¶¨µ½Activity µÄÉúÃüÖÜÆÚ
.compose(((ActivityLifecycleProvider) context).bindToLifecycle())
//±ä³É Notification<Bean> ʹÎÒÃǸü·½±ã´¦ÀíÊý¾ÝºÍ´íÎó
.materialize().share();

// ´¦Àí·µ»ØµÄÊý¾Ý
newsDetailOb.filter(Notification::isOnNext)
.map(n -> n.getValue())
// ¸ø³ÉÔ±±äÁ¿newsDetail ¸³Öµ£¬Ö®Ç°Ìáµ½µÄ5ÖÖ±äÁ¿ÀàÐÍÖеÄÒ»ÖÖ£¨modelÀàÐÍ£©
.doOnNext(m -> newsDetail = m)
.subscribe(m -> initViewModelField(m));

// ÍøÂçÇëÇó´íÎó´¦Àí
NewsListHelper.dealWithResponseError(
newsDetailOb.filter(Notification::isOnError)
.map(n -> n.getThrowable()));
}
//Model -->ViewModel
private void initViewModelField(NewsDetail newsDetail) {
viewStyle.isRefreshing.set(false);
imageUrl.set(newsDetail.getImage());
Observable.just(newsDetail.getBody())
.map(s -> s + "<style type=\"text/css\">" + newsDetail.getCssStr())
.map(s -> s + "</style>")
.subscribe(s -> html.set(s));
title.set(newsDetail.getTitle());
}

ÒÔÉÏ´úÂë»ù±¾°Ñ×¢ÊͲ¹È«ÁË£¬»ù±¾Ë¼Â·±È½ÏÇåÎú£¬£¬RxjavaÉæ¼°µÄ²Ù×÷·û¶¼ÊDZȽϻù±¾µÄ£¬ÈçÓв»¶®£¬¿ÉÒÔÉÔ΢ȥÈëÃÅ£¬Ö®ºóµÄÔ´ÂëÀïÃæViewModelÊý¾ÝÂß¼­´¦Àí¶¼ÊÇÓÃRxjava×ö£¬ËùÒÔÐèÒªÌáǰѧϰһÏ·½±ãÄã¿´¶®Ô´Âë¡£

×¢£ºÎÒÃÇÍÆ¼öʹÓÃMVVM ºÍ RxJavaÒ»¿éʹÓã¬ËäÈ»Á½Õß½ÔÓй۲ìÕßģʽµÄ¸ÅÄµ«ÊÇÎÒÃÇRxJava²»Ê¹ÓÃÔÚÕë¶ÔViewµÄ¼àÌý£¬¸ü¶àÊÇÒµÎñÊý¾ÝÁ÷µÄת»»ºÍ´¦Àí¡£DataBinding¿ò¼ÜÆäʵÊÇרÓÃÓÚView-ViewModelµÄ¶¯Ì¬°ó¶¨µÄ£¬ËüʹµÃÎÒÃǵÄViewModel Ö»ÐèÒª¹Ø×¢Êý¾Ý£¬¶øRxJava ÌṩµÄÇ¿´óÊý¾ÝÁ÷ת»»º¯Êý¸ÕºÃ¿ÉÒÔÓÃÀ´´¦ÀíViewModelÖеÄÖÖÖÖÊý¾Ý£¬µÃµ½ºÜºÃµÄÓÃÎäÖ®µØ£¬Í¬Ê±¼ÓÉÏLambda±í´ïʽ½áºÏµÄÁ´Ê½±à³Ì£¬Ê¹ViewModel µÄ´úÂë·Ç³£¼ò½àͬʱÒ×¶ÁÒ×¶®¡£

ViewModelÓëViewModelµÄЭ×÷

ÔÚͼ1ÖÐÎÒÃÇ¿´µ½Á½¸öViewModelÖ®¼äÓÃÒ»ÌõÐéÏßÁ¬½Ó×Å£¬Öмäд×ÅMessenger£¬Messenger ¿ÉÒÔÀí½âÊÇÒ»¸öÈ«¾ÖÏûϢͨµÀ£¬ÒýÈëmessenger×îÖ÷ÒªµÄÄ¿µÄ¾ÍʵÏÖViewModelºÍViewModelµÄͨÐÅ£¬Ò²¿ÉÒÔÓÃ×öViewºÍViewModelµÄͨÐÅ£¬µ«ÊDz¢²»ÍƼöÕâÑù×ö¡£ViewModelÖ÷ÒªÊÇÓÃÀ´´¦ÀíÒµÎñºÍÊý¾ÝµÄ£¬Ã¿¸öViewModel¶¼ÓÐÏàÓ¦µÄÒµÎñÖ°Ô𣬵«ÊÇÔÚÒµÎñ¸´ÔÓµÄÇé¿öÏ£¬¿ÉÄÜ´æÔÚ½»²æÒµÎñ£¬Õâʱºò¾ÍÐèÒªViewModelºÍViewModel½»»»Êý¾ÝºÍͨÐÅ£¬ÕâʱºòÒ»¸öÈ«¾ÖµÄÏûϢͨµÀ¾ÍºÜÖØÒªµÄ¡£¹ØÓÚMessenger µÄÏêϸʹÓ÷½·¨¿ÉÒÔ²ÎÕÕ MVVM Light Toolkit ʹÓÃÖ¸Ä쵀 Messenger ²¿·Ö,Õâ±ß¸ø³öÒ»¸ö¼òµ¥µÄÀý×Ó½ö¹©²Î¿¼£º ³¡¾°ÊÇÕâÑùµÄ£¬ÄãµÄMainActivity¶ÔÓ¦Ò»¸öMainViewModel£¬MainActivity ÀïÃæ³ýÁË×Ô¼ºµÄÄÚÈÝ»¹°üº¬Ò»¸öFragment£¬Õâ¸öFragment µÄÒµÎñ´¦Àí¶ÔÓ¦ÓÚÒ»¸öFragmentViewModel,FragmentViewModelÇëÇó·þÎñÆ÷²¢»ñÈ¡Êý¾Ý£¬¸ÕºÃÕâ¸öÊý¾ÝMainViewModelÒ²ÐèÒªÓõ½£¬ÎÒÃDz»¿ÉÄÜÔÚMainViewModelÖØÐÂÇëÇóÊý¾Ý£¬ÕâÑù²»Ì«ºÏÀí£¬Õâʱºò¾ÍÐèÒª°ÑÊý¾Ý´«¸øMainViewModel,ÄÇôӦ¸ÃÔõô´«£¬±Ë´ËûÓÐÒýÓûòÕ߻ص÷¡£ÄÇôֻÄÜͨ¹ýÈ«¾ÖµÄÏûϢͨµÀMessenger¡£

FragmentViewModel »ñÈ¡ÏûÏ¢ºó֪ͨMainViewModel ²¢°ÑÊý¾Ý´«¸øËü£º

combineRequestOb.filter(Notification::isOnNext)        
.map(n -> n.getValue())
.map(p -> p.first)
.filter(m -> !m.getTop_stories().isEmpty())
.doOnNext(m ->Observable.just(NewsListHelper.isTomorrow(date)).filter(b -> b).subscribe(b -> itemViewModel.clear()))
// ÉÏÃæµÄ´úÂë¿ÉÒÔ²»¿´£¬¾ÍÊÇ»ñÈ¡ÍøÂçÊý¾Ý £¬Í¨¹ýsend°ÑÊý¾Ý´«¹ýÈ¥
.subscribe(m -> Messenger.getDefault().send(m, TOKEN_TOP_NEWS_FINISH));

MainViewModel ½ÓÊÕÏûÏ¢²¢´¦Àí

Messenger.getDefault().register(activity, NewsViewModel.TOKEN_TOP_NEWS_FINISH, TopNewsService.News.class, (news) -> {
// to something....
}

ÔÚMainActivity onDestroy È¡Ïû×¢²á¾ÍÐÐÁË(²»È»µ¼ÖÂÄÚ´æÐ¹Â¶)

@Override
protected void onDestroy() {
super.onDestroy();
Messenger.getDefault().unregister(this);
}

µ±È»ÉÏÃæµÄÀý×ÓÒ²Ö»ÊǼòµ¥µÄ˵Ã÷Ï£¬Messenger¿ÉÒÔÓÃÔںܶೡ¾°£¬Í¨Öª£¬¹ã²¥¶¼¿ÉÒÔ£¬²»Ò»¶¨Òª´«Êý¾Ý£¬ÔÚÒ»¶¨Ìõ¼þÏÂÒ²¿ÉÒÔÓÃÔÚView²ãºÍViewModel ÉϵÄͨÐź͹㲥¡£ÔËÓ÷¶Î§Ìرð¹ã£¬ÐèÒª¿ª·¢Õß½áºÏʵ¼ÊµÄÒµÎñÖÐÈ¥×ö¸üÉî²ã´ÎµÄÍÚ¾ò¡£

4¡¢×ܽáºÍÔ´Âë

±¾Æª²©ÎĽ²½âÖ÷ÒªÊÇһЩ¸öÈË¿ª·¢¹ý³ÌÖÐ×ܽáµÄAndroid MVVM¹¹½¨Ë¼Ï룬¸ü¶àÊÇÀíÂÛÉϸ÷¸öÄ£¿éÈçºÎ·Ö¹¤£¬´úÂëÈçºÎÉè¼Æ£¬ËäÈ»ÏÖÔÚÒµ½çʹÓÃAndroid MVVMģʽ¿ª·¢»¹±È½ÏÉÙ£¬µ«ÊÇËæ×ÅDataBinding 1.0 µÄ·¢²¼£¬ÏàÐÅÔÚAndroid MVVM Õâ¿éÁìÓò»á¸ü¶àµÄÈËÀ´³¢ÊÔ£¬¸ÕºÃ×î½üÓÃMVVM¿ª·¢ÁËÒ»¶Îʱ¼ä£¬ÓеãÐĵã¬Ð´³öÀ´½ö¹©²Î¿¼¡£

ÎÄÖн²½âµÄ¹ý³Ì´úÂë±È½ÏÉÙ£¬´úÂëÓõ½ÁË×Ô¼º¿ª·¢µÄÒ»¸öMVVM Light Toolkit ¿â£¬¶øÇÒ»¹ÊÇRxJava + Lambda µÄ´úÂ룬¹À¼ÆºÜ¶àÈË¿´×Ŷ¼ÔβËÁË£¬Õâ±ß»á°ÑÔ´Â빫²¼³öÀ´¡£Èç¹ûÄ㻹ûÓг¢ÊÔ¹ýÓÃRxJava+Retrofit+DataBinding ¹¹½¨Android MVVM Ó¦ÓóÌÐò£¬ÄÇôÄã¿ÉÒÔÊÔ×Å¿´Ò»ÏÂÕâ±ßµÄÔ´Âë²¢ÇÒ×öһϳ¢ÊÔ£¬Ëµ²»¶¨Äã»áϲ»¶ÉÏÕâÑùµÄ¿ª·¢¿ò¼Ü¡£

¹ØÓÚMVVM Light Toolkit Ö»ÊÇÒ»¸ö¹¤¾ß¿â£¬Ö÷ҪĿµÄÊǸü¿ì½Ý·½±ãµÄ¹¹½¨Android MVVMÓ¦ÓóÌÐò£¬ÔÚÀïÃæÌí¼ÓÁËһЩ¿Ø¼þ¶îÍâÊôÐÔºÍ×öÁËһЩʼþµÄ·â×°£¬Í¬Ê±Òý½øÁËÈ«¾ÖÏûϢͨµÀMessenger£¬ÓÃÆðÀ´È·Êµ·Ç³£·½±ã£¬Äã¿ÉÒÔ³¢ÊÔһϣ¬µ±È»»¹Óв»Éٵط½Ã»ÓÐÍêÉÆºÍÓÅ»¯£¬ºóÐøÒ²»á²»¶Ï¸üкÍÓÅ»¯£¬Èç¹û²»ÄÜ´ïµ½ÄãµÄÒµÎñÐèÇóʱ£¬ÄãÒ²¿ÉÒÔ×Ô¼ºÌí¼Ó×Ô¼ºÐèÒªµÄÊôÐÔºÍʼþ¡£Èç¹ûÏë¸üÉîÈëÁ˽âMVVM Light Toolkit Çë¿´ÎÒÕâÆª²©ÎÄ MVVM Light Toolkit ʹÓÃÖ¸ÄÏ

Ô´ÂëµØÖ·£º https://github.com/Kelin-Hong/MVVMLightM

library ---> libraryÊÇMVVM Light Toolkit µÄÔ´Â룬ԴÂëºÜ¼òµ¥£¬¸ÐÐËȤµÄͬѧ¿ÉÒÔ¿´¿´£¬Ã»Ê²Ã´¶àÉٵļ¼ÊõÄѶÈ,¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÐèÇó£¬Ìí¼Ó¸ü¶àµÄ¿Ø¼þµÄÊôÐÔºÍʼþ°ó¶¨¡£

sample ---> ±¾ÎÄÉæ¼°µÄ´úÂë¾ù´¦³öÓÚÕâ¸öÏîÄ¿£¬sample Ò»¸öÖªºõÈÕ±¨µÄAppµÄ¼òµ¥ÊµÏÖ£¬´úÂë°üº¬ÁËÒ»´ó²¿·Ö MVVM Light Toolkit µÄʹÓó¡¾°£¬£¨Data¡¢Command¡¢Messenger¾ùÓÐÉæ¼°£©£¬Í¬Ê±sampleÑϸñ°´ÕÕ²©ÎIJûÊöµÄMVVMµÄÉè¼ÆË¼Ï뿪·¢µÄ£¬¶ÔÀí½â±¾ÎÄÓкܴóµÄ°ïÖú£¬»¶Ó­cloneÏÂÀ´¿´¿´¡£

Sample ½ØÍ¼

Ô´ÂëÉæ¼° RxJava+Retrofit+Lambda ÈçÓв»¶®»òû½Ó´¥¹ý£¬»¨µãʱ¼äÈëÃÅһϣ¬Óõ½¶¼ÊDZȽϼòµ¥µÄ¶«Î÷¡£

   
1683 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ