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Ƚϼòµ¥µÄ¶«Î÷¡£ |