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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Android MVVM Ó¦Óÿò¼Ü¹¹½¨¹ý³ÌÏê½â
 
À´Ô´£ºAndroid¿ª·¢ÖÐÎÄÕ¾ ·¢²¼ÓÚ£º 2017-3-17
  2572  次浏览      27
 

¸ÅÊö

˵µ½Android MVVM£¬ÏàÐÅ´ó¼Ò¶¼»áÏëµ½Google 2015ÄêÍÆ³öµÄDataBinding¿ò¼Ü¡£È»¶øÁ½ÕߵĸÅÄîÊDz»Ò»ÑùµÄ£¬²»ÄÜ»ìΪһ̸¡£MVVMÊÇÒ»Öּܹ¹Ä£Ê½£¬¶øDataBindingÊÇÒ»¸öʵÏÖÊý¾ÝºÍUI°ó¶¨µÄ¿ò¼Ü£¬Êǹ¹½¨MVVMģʽµÄÒ»¸ö¹¤¾ß¡£

֮ǰ¿´¹ýºÜ¶à¹ØÓÚAndroid MVVMµÄ²©¿Í£¬µ«´ó¶àÊýÌáµ½µÄ¶¼ÊÇDataBindingµÄ»ù±¾Ó÷¨£¬ºÜÉÙÓÐÎÄÕÂ×Ðϸ½²½âÔÚAndroidÖÐÊÇÈçºÎͨ¹ýDataBindingÈ¥¹¹½¨MVVMµÄÓ¦Óÿò¼ÜµÄ¡£View¡¢ViewModel¡¢Modelÿһ²ãµÄÖ°ÔðÈçºÎ?ËüÃÇÖ®¼äÁªÏµÔõÑù¡¢·Ö¹¤ÈçºÎ¡¢´úÂëÓ¦¸ÃÈçºÎÉè¼Æ?ÕâÊÇÎÒдÕâÆªÎÄÕµijõÖÔ¡£

½ÓÏÂÀ´£¬ÎÒÃÇÏÈÀ´¿´¿´Ê²Ã´ÊÇMVVM£¬È»ºóÔÙÒ»²½Ò»²½À´Éè¼ÆÕû¸öMVVM¿ò¼Ü¡£

MVC¡¢MVP¡¢MVVM

Ê×ÏÈ£¬ÎÒÃÇÏÈ´óÖÂÁ˽âÏÂAndroid¿ª·¢Öг£¼ûµÄģʽ¡£

MVC

View£ºXML²¼¾ÖÎļþ¡£

Model£ºÊµÌåÄ£ÐÍ(Êý¾ÝµÄ»ñÈ¡¡¢´æ´¢¡¢Êý¾Ý״̬±ä»¯)¡£

Controllor£º¶ÔÓ¦ÓÚActivity£¬´¦ÀíÊý¾Ý¡¢ÒµÎñºÍUI¡£

´ÓÉÏÃæÕâ¸ö½á¹¹À´¿´£¬Android±¾ÉíµÄÉè¼Æ»¹ÊÇ·ûºÏMVC¼Ü¹¹µÄ£¬µ«ÊÇAndroidÖд¿´â×÷ΪViewµÄXMLÊÓͼ¹¦ÄÜÌ«Èõ£¬ÎÒÃÇ´óÁ¿´¦ÀíViewµÄÂß¼­Ö»ÄÜдÔÚActivityÖУ¬ÕâÑùActivity¾Í³äµ±ÁËViewºÍControllerÁ½¸ö½ÇÉ«£¬Ö±½Óµ¼ÖÂActivityÖеĴúÂë´ó±¬Õ¨¡£ÏàÐÅ´ó¶àÊýAndroid¿ª·¢Õß¶¼Óöµ½¹ýÒ»¸öAcitivtyÊýÒÔǧÐеĴúÂëÇé¿ö°É!ËùÒÔ£¬¸üÌùÇеÄ˵·¨ÊÇ£¬Õâ¸öMVC½á¹¹×îÖÕÆäʵֻÊÇÒ»¸öModel-View(Activity:View&Controller)µÄ½á¹¹¡£

MVP

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

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

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

Ç°ÃæÎÒÃÇ˵£¬Activity³äµ±ÁËViewºÍControllerÁ½¸ö½ÇÉ«£¬MVP¾ÍÄܺܺõؽâ¾öÕâ¸öÎÊÌ⣬ÆäºËÐÄÀíÄîÊÇͨ¹ýÒ»¸ö³éÏóµÄView½Ó¿Ú(²»ÊÇÕæÕýµÄView²ã)½«PresenterÓëÕæÕýµÄView²ã½øÐнâñî¡£Persenter³ÖÓиÃView½Ó¿Ú£¬¶Ô¸Ã½Ó¿Ú½øÐвÙ×÷£¬¶ø²»ÊÇÖ±½Ó²Ù×÷View²ã¡£ÕâÑù¾Í¿ÉÒÔ°ÑÊÓͼ²Ù×÷ºÍÒµÎñÂß¼­½âñ´Ó¶øÈÃActivity³ÉÎªÕæÕýµÄView²ã¡£

µ«MVPÒ²´æÔÚһЩ±×¶Ë£º

Presenter(ÒÔϼò³ÆP)²ãÓëView(ÒÔϼò³ÆV)²ãÊÇͨ¹ý½Ó¿Ú½øÐн»»¥µÄ£¬½Ó¿ÚÁ£¶È²»ºÃ¿ØÖÆ¡£Á£¶È̫С£¬¾Í»á´æÔÚ´óÁ¿½Ó¿ÚµÄÇé¿ö£¬Ê¹´úÂëÌ«¹ýËé°æ»¯;Á£¶ÈÌ«´ó£¬½âñîЧ¹û²»ºÃ¡£Í¬Ê±¶ÔÓÚUIµÄÊäÈëºÍÊý¾ÝµÄ±ä»¯£¬ÐèÒªÊÖ¶¯µ÷ÓÃV²ã»òÕßP²ãÏà¹ØµÄ½Ó¿Ú£¬Ïà¶ÔÀ´ËµÈ±·¦×Ô¶¯ÐÔ¡¢¼àÌýÐÔ¡£Èç¹ûÊý¾ÝµÄ±ä»¯ÄÜ×Ô¶¯ÏìÓ¦µ½UI¡¢UIµÄÊäÈëÄÜ×Ô¶¯¸üе½Êý¾Ý£¬ÄǸöàºÃ!

MVPÊÇÒÔUIΪÇý¶¯µÄÄ£ÐÍ£¬¸üÐÂUI¶¼ÐèÒª±£Ö¤ÄÜ»ñÈ¡µ½¿Ø¼þµÄÒýÓã¬Í¬Ê±¸üÐÂUIµÄʱºòÒª¿¼Âǵ±Ç°ÊÇ·ñÊÇUIỊ̈߳¬Ò²Òª¿¼ÂÇActivityµÄÉúÃüÖÜÆÚ(ÊÇ·ñÒѾ­Ïú»ÙµÈ)¡£

MVPÊÇÒÔUIºÍʼþΪÇý¶¯µÄ´«Í³Ä£ÐÍ£¬Êý¾Ý¶¼ÊDZ»¶¯µØÍ¨¹ýUI¿Ø¼þ×öչʾ£¬µ«ÊÇÓÉÓÚÊý¾ÝµÄʱ±äÐÔ£¬ÎÒÃǸüÏ£ÍûÊý¾ÝÄÜת±»¶¯ÎªÖ÷¶¯£¬Ï£ÍûÊý¾ÝÄܸüÓлîÐÔ£¬ÓÉÊý¾ÝÀ´Çý¶¯UI¡£

V²ãÓëP²ã»¹ÊÇÓÐÒ»¶¨µÄñîºÏ¶È¡£Ò»µ©V²ãij¸öUIÔªËØ¸ü¸Ä£¬ÄÇô¶ÔÓ¦µÄ½Ó¿Ú¾Í±ØÐëµÃ¸Ä£¬Êý¾ÝÈçºÎÓ³Éäµ½UIÉÏ¡¢Ê¼þ¼àÌý½Ó¿ÚÕâЩ¶¼ÐèҪת±ä£¬Ç£Ò»·¢¶ø¶¯È«Éí¡£Èç¹ûÕâÒ»²ãÒ²Äܽâñî¾Í¸üºÃÁË¡£

¸´ÔÓµÄÒµÎñͬʱҲ¿ÉÄܻᵼÖÂP²ãÌ«´ó£¬´úÂëÓ·Ö×µÄÎÊÌâÒÀÈ»²»Äܽâ¾ö¡£

MVVM

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

Model: ʵÌåÄ£ÐÍ¡£

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

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

Êý¾ÝÇý¶¯

ÔÚ³£¹æµÄ¿ª·¢Ä£Ê½ÖУ¬Êý¾Ý±ä»¯ÐèÒª¸üÐÂUIµÄʱºò£¬ÐèÒªÏÈ»ñÈ¡UI¿Ø¼þµÄÒýÓã¬È»ºóÔÙ¸üÐÂUI¡£»ñÈ¡Óû§µÄÊäÈëºÍ²Ù×÷Ò²ÐèҪͨ¹ýUI¿Ø¼þµÄÒýÓá£ÔÚMVVMÖУ¬ÕâЩ¶¼ÊÇͨ¹ýÊý¾ÝÇý¶¯À´×Ô¶¯Íê³ÉµÄ£¬Êý¾Ý±ä»¯ºó»á×Ô¶¯¸üÐÂUI£¬UIµÄ¸Ä±äÒ²ÄÜ×Ô¶¯·´À¡µ½Êý¾Ý²ã£¬Êý¾Ý³ÉΪÖ÷µ¼ÒòËØ¡£ÕâÑùMVVM²ãÔÚÒµÎñÂß¼­´¦ÀíÖÐÖ»Òª¹ØÐÄÊý¾Ý£¬²»ÐèÒªÖ±½ÓºÍUI´ò½»µÀ£¬ÔÚÒµÎñ´¦Àí¹ý³ÌÖмòµ¥·½±ãºÜ¶à¡£

µÍñîºÏ¶È

MVVMģʽÖУ¬Êý¾ÝÊǶÀÁ¢ÓÚUIµÄ¡£

Êý¾ÝºÍÒµÎñÂß¼­´¦ÓÚÒ»¸ö¶ÀÁ¢µÄViewModelÖУ¬ViewModelÖ»ÐèÒª¹Ø×¢Êý¾ÝºÍÒµÎñÂß¼­£¬²»ÐèÒªºÍUI»òÕ߿ؼþ´ò½»µÀ¡£UIÏëÔõô´¦ÀíÊý¾Ý¶¼ÓÉUI×Ô¼º¾ö¶¨£¬ViewModel²»Éæ¼°ÈκκÍUIÏà¹ØµÄÊ£¬Ò²²»³ÖÓÐUI¿Ø¼þµÄÒýÓ᣼´±ãÊǿؼþ¸Ä±äÁË(±ÈÈ磺TextView»»³ÉEditText)£¬ViewModelÒ²¼¸ºõ²»ÐèÒª¸ü¸ÄÈκδúÂë¡£Ëü·Ç³£ÍêÃÀµÄ½âñîÁËView²ãºÍViewModel£¬½â¾öÁËÉÏÃæÎÒÃÇËù˵µÄMVPµÄÍ´µã¡£

¸üÐÂUI

ÔÚMVVMÖУ¬Êý¾Ý·¢Éú±ä»¯ºó£¬ÎÒÃÇÔÚ¹¤×÷Ïß³ÌÖ±½ÓÐÞ¸Ä(ÔÚÊý¾ÝÊÇḬ̈߳²È«µÄÇé¿öÏÂ)ViewModelµÄÊý¾Ý¼´¿É£¬²»ÓÃÔÙ¿¼ÂÇÒªÇе½Ö÷Ï̸߳üÐÂUIÁË£¬ÕâЩÊÂÇéÏà¹Ø¿ò¼Ü¶¼°ïÎÒÃÇ×öÁË¡£

ÍŶÓЭ×÷

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

¿É¸´ÓÃÐÔ

Ò»¸öViewModel¿ÉÒÔ¸´Óõ½¶à¸öViewÖС£Í¬ÑùµÄÒ»·ÝÊý¾Ý£¬¿ÉÒÔÌṩ¸ø²»Í¬µÄUIÈ¥×öչʾ¡£¶ÔÓÚ°æ±¾µü´úÖÐÆµ·±µÄUI¸Ä¶¯£¬¸üлòÐÂÔöÒ»Ì×View¼´¿É¡£Èç¹ûÏëÔÚUIÉÏ×öA/B Testing£¬ÄÇMVVMÊÇÄã²»¶þÑ¡Ôñ¡£

µ¥Ôª²âÊÔ

ÓÐЩͬѧһ¿´µ½µ¥Ôª²âÊÔ£¬¿ÉÄÜÄÔ´ü¶¼´ó¡£Êǰ¡£¬Ð´³Éһ͎¬ºýµÄ´úÂëÔõô¿ÉÄÜ×öµ¥Ôª²âÊÔ?Èç¹ûÄãÃÇÒÔ´úÂëÌ«ÀÃÎÞ·¨Ð´µ¥Ôª²âÊÔ¶øÌӱܣ¬ÄÇ¿ÉÕæÊDz»ºÃµÄÏûÏ¢ÁË¡£Õâʱºò£¬ÄãÐèÒªMVVMÀ´Õü¾È¡£

ÎÒÃÇÇ°ÃæËµ¹ýÁË£¬ViewModel²ã×öµÄÊÂÊÇÊý¾Ý´¦ÀíºÍÒµÎñÂß¼­£¬View²ãÖйØ×¢µÄÊÇUI£¬Á½ÕßÍêȫûÓÐÒÀÀµ¡£²»¹ÜÊÇUIµÄµ¥Ôª²âÊÔ»¹ÊÇÒµÎñÂß¼­µÄµ¥Ôª²âÊÔ£¬¶¼ÊǵÍñîºÏµÄ¡£ÔÚMVVMÖÐÊý¾ÝÊÇÖ±½Ó°ó¶¨µ½UI¿Ø¼þÉϵÄ(²¿·ÖÊý¾ÝÊÇ¿ÉÒÔÖ±½Ó·´Ó³³öUIÉϵÄÄÚÈÝ)£¬ÄÇôÎÒÃǾͿÉÒÔÖ±½Óͨ¹ýÐ޸İ󶨵ÄÊý¾ÝÔ´À´¼ä½Ó×öһЩAndroid UIÉϵIJâÊÔ¡£

ͨ¹ýÉÏÃæµÄ¼òÊöÒÔ¼°Ä£Ê½µÄ¶Ô±È£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖMVVMµÄÓÅÊÆ»¹ÊǷdz£Ã÷ÏԵġ£ËäȻĿǰAndroid¿ª·¢ÖпÉÄÜÕæÕýÔÚʹÓÃMVVMµÄºÜÉÙ£¬µ«ÊÇÖµµÃÎÒÃÇÈ¥×öһЩ̽Ìֺ͵÷ÑС£

ÈçºÎ¹¹½¨MVVMÓ¦Óÿò¼Ü

ÈçºÎ·Ö¹¤

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

View

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

ViewModel

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

Model

Model²ã×î´óµÄÌØµãÊDZ»¸³ÓèÁËÊý¾Ý»ñÈ¡µÄÖ°Ôð£¬ÓëÎÒÃÇÆ½³£Model²ãÖ»¶¨ÒåʵÌå¶ÔÏóµÄÐÐΪ½ØÈ»²»Í¬¡£ÊµÀýÖУ¬Êý¾ÝµÄ»ñÈ¡¡¢´æ´¢¡¢Êý¾Ý״̬±ä»¯¶¼ÊÇModel²ãµÄÈÎÎñ¡£Model°üÀ¨ÊµÌåÄ£ÐÍ(Bean)¡¢RetrofitµÄService £¬»ñÈ¡ÍøÂçÊý¾Ý½Ó¿Ú£¬±¾µØ´æ´¢(Ôöɾ¸Ä²é)½Ó¿Ú£¬Êý¾Ý±ä»¯¼àÌýµÈ¡£ModelÌṩÊý¾Ý»ñÈ¡½Ó¿Ú¹©ViewModelµ÷Ó㬾­Êý¾Ýת»»ºÍ²Ù×÷²¢×îÖÕÓ³Éä°ó¶¨µ½View²ãij¸öUIÔªËØµÄÊôÐÔÉÏ¡£

ÈçºÎЭ×÷

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

ÉÏͼ·´Ó³ÁËMVVM¿ò¼ÜÖи÷¸öÄ£¿éµÄÁªÏµºÍÊý¾ÝÁ÷µÄ×ßÏò£¬ÎÒÃÇ´Óÿ¸öÄ£¿éÒ»Ò»²ð·ÖÀ´¿´¡£ÄÇôÎÒÃÇÖØµã¾ÍÊÇÏÂÃæµÄÈý¸öЭ×÷¡£

ViewModelÓëViewµÄЭ×÷¡£

ViewModelÓëModelµÄЭ×÷¡£

ViewModelÓëViewModelµÄЭ×÷¡£

ViewModelÓëViewµÄЭ×÷

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

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

Context (ÉÏÏÂÎÄ)

Model (Êý¾ÝÔ´ Java Bean)

Data Field (Êý¾Ý°ó¶¨)

Command (ÃüÁî°ó¶¨)

Child ViewModel (×ÓViewModel)

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

//contextprivate Activity context;
//model£¨Êý¾ÝÔ´ Java Bean£©private NewsService.
News news;private TopNewsService.News topNews;
//Êý¾Ý°ó¶¨£¬°ó¶¨µ½UIµÄ×Ö¶Î
£¨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<>((itemCount) -> {

});//Child ViewModelpublic 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ÄØ?Ô­ÒòÖ÷ÒªÓÐÒÔÏÂÁ½µã£º

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

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

µ±È»£¬³ý´ËÒÔÍ⣬µ÷Óù¤¾ßÀà¡¢°ïÖúÀàÓÐʱºòÐèÒªContext×öΪ²ÎÊýµÈÒ²ÊÇÔ­ÒòÖ®Ò»¡£

Model (Êý¾ÝÔ´)

ModelÊÇÊ²Ã´ÄØ?Æäʵ¾ÍÊÇÊý¾ÝÔ´£¬¿ÉÒÔ¼òµ¥Àí½âÊÇÎÒÃÇÓÃJSONת¹ýÀ´µÄBean¡£ViewModelÒª°ÑÊý¾ÝÓ³Éäµ½UIÖпÉÄÜÐèÒª´óÁ¿¶ÔModelµÄÊý¾Ý¿½±´ºÍ²Ù×÷£¬ÄÃModelµÄ×Ö¶ÎÈ¥Éú³É¶ÔÓ¦µÄObservableFieldÈ»ºó°ó¶¨µ½UI(ÎÒÃ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Âß¼­²ÅÄÜ×îÖÕ»ñÈ¡ÎÒÃÇÏëÒªµÄ¡£¼òµ¥¾Ù¸öÀý×Ó£¬±ÈÈçÄãÏëÒª¼àÌý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£¬ÄÇôViewModelµÄʼþ´¦Àí¶¼ÊÇÍйÜReplyCommandÀ´´¦Àí£¬ÕâÑùµÄ´úÂë¿´ÆðÀ´»á±È½ÏÃÀ¹ÛºÍÇåÎú¡£CommandÖ»ÊǶÔUIʼþµÄÒ»²ã¸ôÀëUI²ãµÄ·â×°£¬ÔÚʼþ´¥·¢Ê±°ÑViewModel²ã¿ÉÄÜÐèÒªµÄÊý¾Ý´«¸øViewModel²ã£¬¶ÔʼþµÄ´¦Àí×öÁËͳһ»¯£¬ÊÇ·ñʹÓõϰ£¬»¹ÊÇ¿´Äã¸öÈËϲºÃÁË¡£

Child ViewModel(×ÓViewModel)

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

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

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

×ܵÄÀ´Ëµ£¬ViewModelºÍView֮ǰ½ö½öÖ»Óа󶨵ĹØÏµ£¬View²ãÐèÒªµÄÊôÐÔºÍʼþ´¦Àí¶¼ÊÇÔÚXMLÀïÃæ°ó¶¨ºÃÁË£¬ViewModel²ã²»»áÈ¥²Ù×÷UI£¬Ö»ÊǸù¾ÝÒµÎñÒªÇó´¦ÀíÊý¾Ý£¬ÕâЩÊý¾Ý×Ô¶¯Ó³Éäµ½View²ã¿Ø¼þµÄÊôÐÔÉÏ¡£

¹ØÓÚViewModelÀàÖаüº¬ÄÄЩģ¿éºÍ×ֶΣ¬Õâ¸öÐèÒª¿ª·¢Õß×Ô¼ºÈ¥ºâÁ¿£¬ÎÒÃǽ¨ÒéViewModel²»ÒªÒýÈëÌ«¶àµÄ³ÉÔ±±äÁ¿£¬³ÉÔ±±äÁ¿×îºÃÖ»ÓÐÉÏÃæµÄÌáµ½µÄ5ÖÖ(context¡¢model¡­¡­)£¬Äܲ»ÒýÈëÆäËûÀàÐ͵ıäÁ¿¾Í¾¡Á¿²»ÒªÒý½øÀ´£¬Ì«¶àµÄ³ÉÔ±±äÁ¿¶ÔÓÚÕû¸ö´úÂë½á¹¹ÆÆ»µºÜ´ó£¬ºóÃæÎ¬»¤µÄÈËҪʱ¿Ì¹ØÐijÉÔ±±äÁ¿Ê²Ã´Ê±ºò±»³õʼ»¯¡¢Ê²Ã´Ê±ºò±»Çåµô¡¢Ê²Ã´Ê±ºò±»¸³Öµ»òÕ߸ı䣬һ¸öϸ½Ú²»Ð¡ÐÄ¿ÉÄܾͳöÏÖDZÔÚµÄBug¡£Ì«¶à²»ÇåÎú¶¨ÒåµÄ³ÉÔ±±äÁ¿ÓÖûÓÐ×¢Ê͵ĴúÂëÊǺÜÄÑά»¤µÄ¡£

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

public class MainViewModel implements ViewModel { 
....//trueµÄʱºòµ¯³öDialog£¬falseµÄʱºò¹Øµô
dialogpublic final ObservableBoolean isShowDialog
= new ObservableBoolean(); .... ..... }// ÔÚView²ã×öÒ»¸ö¶ÔisShowDialog¸Ä±äµÄ¼àÌý
public class MainActivity extends RxBasePmsActivity
{private MainViewModel mainViewModel;
@Overrideprotected 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ÖУ¬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 -->
ViewModelprivate 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());
}

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

×¢2£ºÒòΪ±¾ÎÄÑùÀýModel²ãֻɿ¼°µ½ÍøÂçÊý¾ÝµÄ»ñÈ¡£¬²¢Ã»ÓÐÊý¾Ý¿â¡¢´æ´¢¡¢Êý¾Ý״̬±ä»¯µÈÆäËûÒµÎñ£¬ËùÒÔ±¾ÎÄÉæ¼°µÄÔ´Â벢ûÓе¥¶À°ÑModel²ã³é³öÀ´£¬ÎÒÃÇÊǽ¨Òé°ÑModel²ãµ¥¶À³é³öÀ´·ÅÒ»¸öÀàÖУ¬È»ºóÒÔÃæÏò½Ó¿Ú±à³Ì·½Ê½ÌṩÍâ½ç»ñÈ¡ºÍ´æ´¢Êý¾ÝµÄ½Ó¿Ú¡£

ViewModelÓëViewModelµÄЭ×÷

ÔÚͼ1ÖÐÎÒÃÇ¿´µ½Á½¸öViewModelÖ®¼äÓÃÒ»ÌõÐéÏßÁ¬½Ó×Å£¬Öмäд×ÅMessenger¡£Messenger¿ÉÒÔÀí½âÊÇÒ»¸öÈ«¾ÖÏûϢͨµÀ£¬ÒýÈëMessenger×îÖ÷ÒªµÄÄ¿µÄÊÇʵÏÖViewModelºÍViewModelµÄͨÐÅ£¬ËäȻҲ¿ÉÒÔÓÃÓÚViewºÍViewModelµÄͨÐÅ£¬µ«²¢²»ÍƼö¡£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ÉϵÄͨÐź͹㲥£¬ÔËÓ÷¶Î§Ìرð¹ã£¬ÐèÒª¿ª·¢Õß½áºÏʵ¼ÊµÄÒµÎñÖÐÈ¥×ö¸üÉî²ã´ÎµÄÍÚ¾ò¡£

×ܽáºÍÔ´Âë

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

±¾ÎĺÍÔ´Â붼ûÓÐÉæ¼°µ½µ¥Ôª²âÊÔ£¬Èç¹ûÐèҪдµ¥Ôª²âÊÔ£¬¿ÉÒÔ½áºÏGoogle¿ªÔ´µÄMVP¿ò¼ÜÌí¼ÓContractÀàʵÏÖÃæÏò½Ó¿Ú±à³Ì£¬¿ÉÒÔ°ïÖúÄã¸üºÃµØ±àдµ¥²â¡£Í¬Ê±MVPºÍMVVM²¢Ã»ÊëºÃÊ뻵£¬ÊʺÏÒµÎñ¡¢ÊʺÏ×Ô¼ºµÄ²ÅÊÇ×îÓмÛÖµµÄ£¬½¨Òé½áºÏGoogle¿ªÔ´µÄMVP¿ò¼ÜºÍ±¾ÎĽéÉܵÄMVVMÏà¹ØµÄ֪ʶȥ̽Ë÷ÊʺÏ×Ô¼ºÒµÎñ·¢Õ¹µÄ¿ò¼Ü¡£

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

ÏîÄ¿µÄÔ´ÂëµØÖ· https://github.com/Kelin-Hong/MVVMLight ¡£ÆäÖУº

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

sampleÊÇÒ»¸öʵÏÖÖªºõÈÕ±¨Ê×Ò³ÑùʽµÄDemo£¬±¾ÎĵĴúÂëʾÀý¾ù³ö×ÔÕâ¸öDemo¡£´úÂë°üº¬ÁËÒ»´ó²¿·ÖMVVM Light ToolkitµÄʹÓó¡¾°(Data¡¢Command¡¢Messenger¾ùÓÐÉæ¼°)£¬Í¬Ê±sampleÑϸñ°´ÕÕ±¾²©ÎIJûÊöµÄMVVMÉè¼ÆË¼Ï뿪·¢£¬¶ÔÀí½â±¾ÎÄ»áÓбȽϴóµÄ°ïÖú¡£

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

   
2572 ´Îä¯ÀÀ       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ÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ