package Ġcom . example . android demo . jet pack . architecture . li ved ata Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . example . android demo . R Ċ import Ġkotlinx . android . synt hetic . main . activity _ live _ data .* Ċ Ċ /** Ċ Ġ* Ġ åıĤèĢĥ ï¼ļ Ċ Ġ* Ġhttp :// li uw ang shu . cn / application / jet pack / 4 - li ved ata - use . html Ċ Ġ* Ġhttps :// developer . android . com / topic / libraries / architecture / li ved ata Ċ Ġ* Ċ Ġ* Ġåı¯ è§Ĥ å¯Ł çļĦæķ°æį® æºĲ LiveData ï¼ļ Ċ Ġ* ĠLive Data å®ĥ æĺ¯ åħ·æľī çĶŁåĳ½ åĳ¨æľŁ æĦŁ åºĶ èĥ½åĬĽ çļĦ ãĢģ åı¯ è§Ĥ å¯Ł çļĦæķ°æį® åŃĺåĤ¨ åĻ¨ ï¼Į å®ĥ åħ·æľī ä»¥ä¸ĭ ä¸īä¸ª çī¹ çĤ¹ ï¼ļ Ċ Ġ* Ġ 1 ãĢģ åıªæľī å½ĵ è§Ĥ å¯Ł èĢħ å¤Ħ äºİ æ´» è· ĥ çĬ¶æĢģ ( STARTED ãĢģ RE SU MED ), ĠLive Data æīį ä¼ļ åıĳéĢģ æĽ´æĸ° éĢļçŁ¥ ç»Ļ å®ĥ ï¼Į èĢĮ å¤Ħ äºİ éĿŀ æ´» è· ĥ çĬ¶æĢģ ( PA USED ãĢģ STOP PED ) çļĦ è§Ĥ å¯Ł èĢħ åĪĻ ä¸įä¼ļ æĶ¶ åĪ° æĽ´æĸ° éĢļçŁ¥ Ċ Ġ* Ġ 2 ãĢģ å½ĵ è§Ĥ å¯Ł èĢħ çĶ± éĿŀ æ´» è· ĥ çĬ¶æĢģ è½¬ ä¸º æ´» è· ĥ çĬ¶æĢģ æĹ¶ ï¼Į LiveData å°Ĩ åıĳéĢģ æľĢ æĸ°çļĦ æĽ´æĸ° éĢļçŁ¥ ç»Ļ å®ĥ ï¼Į å¦Ĥæŀľ æ²¡æľī æķ°æį® æĽ´æĸ° ï¼Į åĪĻ è§Ĥ å¯Ł èĢħ ä¸įä¼ļ åıĳçĶŁ æĽ´æĸ° Ċ Ġ* Ġ 3 ãĢģ å½ĵ è§Ĥ å¯Ł èĢħ åħ³èģĶ çļĦ çĶŁåĳ½ åĳ¨æľŁ ç»Ħä»¶ è¢« éĶĢ æ¯ ģ æĹ¶ ( DESTROY ED ), ĠLive Date ä¼ļ èĩªåĬ¨ ç§»éĻ¤ è¯¥ è§Ĥ å¯Ł èĢħ Ċ Ġ* Ċ Ġ* Ġ ç»Ħ æĪĲ ï¼ļ Ċ Ġ* ĠLive Data ï¼ļ æĬ½ è±¡ ç±» ï¼Į ä¸įåı¯ ä¿®æĶ¹ æķ°æį® Ċ Ġ* ĠObserver ï¼ļ è§Ĥ å¯Ł èĢħ ï¼Į çĶ¨æĿ¥ è§Ĥ å¯Ł LiveData ï¼Į éĩĮéĿ¢ åıªæľī ä¸Ģä¸ª onChange æĸ¹æ³ķ Ċ Ġ* ĠMutable LiveData ï¼ļ LiveData çļĦ åŃĲ ç±» ï¼Į åı¯ä»¥ ä¿®æĶ¹ æķ°æį® Ċ Ġ* ĠMed iator LiveData ï¼ļ LiveData çļĦ åŃĲ ç±» ï¼Į åı¯ä»¥ åĲĪå¹¶ å¤ļä¸ª æķ°æį® æºĲ LiveData Ċ Ġ* Ċ Ġ* Ġä¸Ģ ãĢģ LiveData çļĦ åŁºæľ¬ ä½¿çĶ¨ ï¼ļ Ċ Ġ* Ġ 1 ãĢģ å®ļä¹ī LiveData å¯¹è±¡ ï¼Į åĮħ è£ ¹ ä½ı éľĢè¦ģ åŃĺåĤ¨ çļĦæķ°æį® çļĦæķ°æį® ç±»åŀĭ Ċ Ġ* Ġ 2 ãĢģ å®ŀçİ° Observer æİ¥åı£ çļĦ onChange æĸ¹æ³ķ ï¼Į åľ¨ onChange æĸ¹æ³ķ ä¸Ń æĽ´æĸ° UI Ċ Ġ* Ġ 3 ãĢģ ä½¿çĶ¨ LiveData çļĦ observe æĸ¹æ³ķ è§Ĥ å¯Ł LiveData ï¼Į å¹¶ ä¼łåħ¥ Observer å¯¹è±¡ Ċ Ġ* Ġ 4 ãĢģ è°ĥçĶ¨ LiveData çļĦ setValue / post Value æĸ¹æ³ķ æĽ´æĸ° æķ°æį® Ċ Ġ* Ċ Ġ* Ġ äºĮ ãĢģ æī©å±ķ LiveData ï¼ļ Ċ Ġ* Ġ ç»§æī¿ LiveData åı¯ä»¥ éĩį åĨĻ on Active åĴĮ on In Active æĸ¹æ³ķ Ċ Ġ* Ċ Ġ* Ġ ä¸ī ãĢģ è½¬æį¢ LiveData ï¼ļ Ċ Ġ* Ġ 1 ãĢģ éĢļè¿ĩ Transform ations çļĦ map æĸ¹æ³ķ æĬĬ LiveData ä¸ŃçļĦ åĢ¼ è½¬æį¢ æĪĲ åı¦å¤ĸ ä¸Ģç§į æķ°æį® ç±»åŀĭ Ċ Ġ* Ġ 2 ãĢģ éĢļè¿ĩ Transform ations çļĦ switch Map æĸ¹æ³ķ æł¹æį® LiveData ä¸ŃçļĦ åĢ¼ æĬĬ LiveData è½¬æį¢ æĪĲ ä¸įåĲĮçļĦ LiveData å®ŀä¾ĭ Ċ Ġ* Ċ Ġ* Ġ åĽĽ ãĢģ åĲĪå¹¶ ãĢģ è§Ĥ å¯Ł å¤ļä¸ª LiveData ï¼ļ Ċ Ġ* ĠéĢļè¿ĩ Mediator LiveData çļĦ add Source æĸ¹æ³ķ æ·»åĬł å¤ļä¸ª Live Date ï¼Į ä»İ èĢĮ çĽĳåĲ¬ å¤ļä¸ª LiveData ï¼Į å½ĵ æŁĲä¸ª LiveData æĶ¹åıĺ æĹ¶ Ċ Ġ* ĠMed iator LiveData å°±ä¼ļ çĽĳåĲ¬ åĪ° , Ġä»İ èĢĮ è§¦åıĳ Mediator LiveData çļĦ è§Ĥ å¯Ł èĢħ æĽ´æĸ° Ċ Ġ*/ Ċ class ĠLive Data Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠLive Data Activity :: class . java . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ 1 ãĢģ å®ļä¹ī LiveData å¯¹è±¡ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġstring LiveData : ĠMutable LiveData < String > Ġ= ĠMy Mutable LiveData (" åĪĿå§ĭ åĢ¼ ") ĊĊĠĠĠ Ġ/** Ġ 2 ãĢģ å®ŀçİ° Observer æİ¥åı£ çļĦ onChange æĸ¹æ³ķ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġstring Observer : ĠObserver < String > Ġ= ĠObserver Ġ{ ĊĠĠĠĠĠĠĠ Ġtv _ string . text Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcontrol Ġ= Ġfalse ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠéĢļè¿ĩ Transform ations çļĦ map æĸ¹æ³ķ æĬĬ LiveData ä¸ŃçļĦ åĢ¼ è½¬æį¢ æĪĲ åı¦å¤ĸ ä¸Ģç§į æķ°æį® ç±»åŀĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġbool LiveData : ĠLive Data < Boolean > Ġ= ĠTransform ations . map ( string LiveData ){ ĊĠĠĠĠĠĠĠ Ġcontrol Ġ= Ġ! control ĊĠĠĠĠĠĠĠ Ġcontrol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠéĢļè¿ĩ Transform ations çļĦ switch Map æĸ¹æ³ķ æł¹æį® LiveData ä¸ŃçļĦ åĢ¼ æĬĬ LiveData è½¬æį¢ æĪĲ ä¸įåĲĮçļĦ LiveData å®ŀä¾ĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġtransformed LiveData : ĠLive Data < Any > Ġ= ĠTransform ations . switch Map ( bool LiveData ){ ĊĠĠĠĠĠĠĠ Ġif ( it ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMutable LiveData < Any >( 9 1 5 5 ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMutable LiveData < Any >( 9 1 5 5 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ ç½ĳç»ľ æºĲ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġnet Work LiveData : ĠLive Data < String > Ġ= ĠMutable LiveData (" ä»İ ç½ĳç»ľ è¿ĶåĽŀ çļĦåĢ¼ ") ĊĠĠĠ Ġ/** Ġ æľ¬åľ° æºĲ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlocal LiveData : ĠLive Data < String > Ġ= ĠMutable LiveData (" ä»İ æľ¬åľ° åıĸ åĩº çļĦåĢ¼ ") ĊĠĠĠ Ġ/** Ġ çĶ¨æĿ¥ çĽĳåĲ¬ å¤ļä¸ª æķ°æį® æºĲ æĽ´æĸ° çļĦ Mediator LiveData Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmerge LiveData : ĠMed iator LiveData < String > Ġ= ĠMed iator LiveData () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ live _ data ) ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ 3 ãĢģ ä½¿çĶ¨ observe æĸ¹æ³ķ è§Ĥ å¯Ł LiveData ï¼Į å¹¶ ä¼łåħ¥ Observer å¯¹è±¡ åĴĮ Lifecycle Owner å¯¹è±¡ Ġ*/ ĊĠĠĠĠĠĠĠ Ġstring LiveData . observe ( this , Ġstring Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ä½¿çĶ¨ observe Fore ver æĸ¹æ³ķ è§Ĥ å¯Ł LiveData ï¼Į åıª ä¼łåħ¥ Observer å¯¹è±¡ ï¼Į ä¸į ä¼łåħ¥ Lifecycle Owner å¯¹è±¡ ĊĠĠĠĠĠĠĠ Ġ// éĢļè¿ĩ observe Fore ver æĸ¹æ³ķ æ³¨åĨĮ çļĦ Observer ä¸į ä¸İ åħ·ä½ĵ çļĦ çĶŁåĳ½ åĳ¨æľŁ ç»Ħä»¶ ç»ĳå®ļ ï¼Į æīĢä»¥ åıª è¦ģ LiveData åıĳçĶŁ åıĺåĮĸ ï¼Į Observer å°±ä¼ļ æĶ¶ åĪ° æĽ´æĸ° éĢļçŁ¥ ĊĠĠĠĠĠĠĠ Ġ// åı¯ä»¥éĢļè¿ĩ remove Observer æĸ¹æ³ķ ç§»éĻ¤ è¿Ļä¸ª Observer å¯¹è±¡ ĊĠĠĠĠĠĠĠ Ġstring LiveData . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate (): Ġstring LiveData Ġchange , Ġdate Ġ= Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn _ change . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġ 4 ãĢģ è°ĥçĶ¨ LiveData çļĦ setValue / post Value æĸ¹æ³ķ æĽ´æĸ° æķ°æį® Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// setValue æĸ¹æ³ķ åľ¨ main Ġthread è°ĥçĶ¨ ï¼Į post Value æĸ¹æ³ķ åľ¨ work Ġthread è°ĥçĶ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring LiveData . value Ġ= Ġ" æĶ¹åıĺ åĲİ çļĦåĢ¼ " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// string LiveData çļĦ ä¸ĭ æ¸¸ ï¼Į å½ĵ string LiveData æĶ¹åıĺ ï¼Į bool LiveData çļĦ Observer æĽ´æĸ° ĊĠĠĠĠĠĠĠ Ġbool LiveData . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate (): Ġbool LiveData Ġchange , Ġdata Ġ= Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// bool LiveData çļĦ ä¸ĭ æ¸¸ ï¼Į å½ĵ bool LiveData æĶ¹åıĺ ï¼Į transformed LiveData çļĦ Observer æĽ´æĸ° ĊĠĠĠĠĠĠĠ Ġtransformed LiveData . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate (): Ġtransformed LiveData Ġchange , Ġdata Ġ= Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠéĢļè¿ĩ Mediator LiveData çļĦ add Source æĸ¹æ³ķ åĲĪå¹¶ å¤ļä¸ª Live Date ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ// æ·»åĬł ç½ĳç»ľ æºĲ åĪ° Mediator LiveData ä¸Ń ĊĠĠĠĠĠĠĠ Ġmerge LiveData . add Source ( net Work LiveData ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è°ĥçĶ¨ Mediator LiveData çļĦ set / post Value æĸ¹æ³ķ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge LiveData . value Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// æ·»åĬł æľ¬åľ° æºĲ åĪ° Mediator LiveData ä¸Ń ĊĠĠĠĠĠĠĠ Ġmerge LiveData . add Source ( local LiveData ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è°ĥçĶ¨ Mediator LiveData çļĦ set / post Value æĸ¹æ³ķ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge LiveData . value Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// è§Ĥ å¯Ł Mediator LiveData ï¼Į å½ĵ æŁĲä¸ª æºĲ æĽ´æĸ° æĹ¶ ï¼Į Observer çļĦ onChange æĸ¹æ³ķ å°±ä¼ļ åĽŀè°ĥ ĊĠĠĠĠĠĠĠ Ġmerge LiveData . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate (): Ġmerge LiveData Ġchange , Ġdata Ġ= Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æī©å±ķ LiveData ï¼ļ ĊĠĠĠĠ Ġ* Ġå½ĵ LiveData çĶ± ä¸į æ´» è· ĥ çĬ¶æĢģ è½¬ ä¸º æ´» è· ĥ çĬ¶æĢģ æĹ¶ ï¼Į on Active æĸ¹æ³ķ åĽŀè°ĥ ï¼Į å½ĵ LiveData ä¸Ń æ²¡æľī è§Ĥ å¯Ł èĢħ å¤Ħ äºİ æ´» è· ĥ çĬ¶æĢģ æĹ¶ ï¼Į on In Active æĸ¹æ³ķ åĽŀè°ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠMy Mutable LiveData < T >( value : ĠT ) Ġ: ĠMutable LiveData < T >( value ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Active () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" My Mutable LiveData , Ġon Active (): Ġlive Data Ġactive ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo : Ġ å¼Ģå§ĭ è¿ŀæİ¥ æľįåĬ¡ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Inactive () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" My Mutable LiveData , Ġon In Active (): Ġlive Data Ġin Active ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo ï¼ļ æĸŃ å¼Ģ æľįåĬ¡ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ