{"id":1152,"date":"2019-03-25T12:38:21","date_gmt":"2019-03-25T03:38:21","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=1152"},"modified":"2020-11-27T13:49:43","modified_gmt":"2020-11-27T04:49:43","slug":"singlieliveevent%eb%a1%9c-%ec%9d%b4%eb%b2%a4%ed%8a%b8-%ec%b2%98%eb%a6%ac%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=1152","title":{"rendered":"SingleLiveEvent\ub85c \uc774\ubca4\ud2b8 \ucc98\ub9ac\ud558\uae30"},"content":{"rendered":"<p>AAC lifecycle\ucef4\ud3ec\ub10c\ud2b8\uc758 \ub4f1\uc7a5\uacfc \ud568\uaed8 MVVM\ud328\ud134\uc774 \ub2e4\uc18c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<br \/>\n\uae30\uc874\uc758 \ubc29\uc2dd\uc740 \ub2e4\uc74c \uadf8\ub9bc\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" width=\"296\" height=\"171\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2019\/03\/drawit-diagram-1.png\" class=\"aligncenter wp-image-1153\" alt=\"\" title=\"drawit diagram\" \/><\/p>\n<p>Activity\uc640 ViewModel\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac\ud558\uace0 ViewModel\uc740 Navigator\ub97c \uc774\uc6a9\ud558\uc5ec Activity\uc5d0\uac8c \uc774\ubca4\ud2b8\ub97c \uc804\ub2ec\ud569\ub2c8\ub2e4. Navigator\uc758 \uad6c\ud604\uccb4\ub294 \ubcf4\ud1b5 Activity\uac00 \ub418\uace4\ud588\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>BaseObservable\uc744 \uc0c1\uc18d\ubc1b\uc544 ViewModel\uc744 \ub9cc\ub4e4\uba74 \ub370\uc774\ud130\ubc14\uc778\ub529 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc640 \uad81\ud569\ub3c4 \uc798\ub9de\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7f0\ub370, AAC ViewModel\uc744 \uc0ac\uc6a9\ud558\uace0 \ubd80\ud130\ub294 \uc774 \ud328\ud134\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<blockquote>\n<p>Caution:\u00a0A\u00a0<a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/ViewModel.html\"><code>ViewModel<\/code><\/a>\u00a0must never reference a view,\u00a0<a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/Lifecycle.html\"><code>Lifecycle<\/code><\/a>, or any class that may hold a reference to the activity context.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/viewmodel\">\uacf5\uc2dd\ubb38\uc11c<\/a>\uc5d0 \ub098\uc640\uc788\ub294 <strong>ViewModel \uc0ac\uc6a9\uc5d0 \ub300\ud55c \uc81c\uc57d\uc0ac\ud56d\uc744 \ud655\uc778\ud574\ubcf4\uba74, ViewModel\uc740 View, Lifecycle \ub610\ub294 \uc561\ud2f0\ube44\ud2f0 \ucee8\ud14d\uc2a4\ud2b8\ub97c \ucc38\uc870\ud558\ub294 \uc5b4\ub5a4 \ud074\ub798\uc2a4\ub3c4 \ucc38\uc870\ud558\uc9c0 \ub9d0\ub77c\uace0 \uacbd\uace0<\/strong> \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc561\ud2f0\ube44\ud2f0\uac00 \uc7ac\uc0dd\uc131\ub418\ub294 \uacbd\uc6b0 AAC ViewModel\uc5d0 \uc758\ud574 \uc774\uc804 \uc561\ud2f0\ube44\ud2f0\uc758 \ub808\ud37c\ub7f0\uc2a4 \uce74\uc6b4\ud2b8\uac00 \uc720\uc9c0 \ub428\uc73c\ub85c\uc368 \uba54\ubaa8\ub9ac \ub204\uc218\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\uc8e0. \uc989, Navigator(Activity)\uac1d\uccb4\uac00 AAC ViewModel\uc5d0 \uc758\ud574 \ucc38\uc870\ub418\uba74 \uba54\ubaa8\ub9ac \ub204\uc218\uac00 \ubc1c\uc0dd\ud558\uc5ec \uc774\uc804 \ud328\ud134\uc744 \uc0ac\uc6a9\ud560\uc218\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub798\uc11c \uad6c\uae00 \uc0d8\ud50c\uc758 <a href=\"https:\/\/github.com\/googlesamples\/android-architecture\">android-architecture \uc0d8\ud50c<\/a>\uc744 \uc0b4\ud3b4\ubcf4\uba74 \uc774 \ubb38\uc81c\ub97c \uc774\ub7f0\ubc29\uc2dd\uc73c\ub85c \ud480\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" width=\"441\" height=\"61\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2019\/03\/drawit-diagram-2.png\" class=\"aligncenter wp-image-1154\" alt=\"\" title=\"drawit diagram\" srcset=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2019\/03\/drawit-diagram-2.png 441w, https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2019\/03\/drawit-diagram-2-300x41.png 300w\" sizes=\"(max-width: 441px) 100vw, 441px\" \/><\/p>\n<p>ViewModel\uc5d0\uc11c \uc5b4\ub5a4 \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud560\ub54c LiveData\uc758 value\ub97c \ubcc0\uacbd\ud568\uc73c\ub85c\uc368 state\uc758 \ubcc0\ud654\ub97c \uc918 Activity\uac00 \uc774\ubca4\ud2b8\ub97c \uac10\uc9c0 \ud560 \uc218 \uc788\uac8c \ub418\ub294\uac83\uc774\uc8e0. \uc561\ud2f0\ube44\ud2f0\ub97c \ucc38\uc870\ud558\ub294 Navigator\uac19\uc740 \uac1d\uccb4\ub3c4 \uc5c6\uc73c\ubbc0\ub85c \uba54\ubaa8\ub9ac\ub204\uc218\ub3c4 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\uba74 \uc774\ubca4\ud2b8\ub97c \ubc1c\uc0dd\uc2dc\ud0ac\ub54c\ub9c8\ub2e4 \uc5b4\ub5a4 value\ub97c \uc8fc\uc785\ud574\uc57c\ud55c\ub2e4\ub294\uac83\uc778\ub370, \uc5b4\ub5a4 value\ub97c \uc918\uc57c\ud560\uae4c\uc694? \ub610\ub294 \ud30c\ub77c\ubbf8\ud130\ub85c \ub118\uae38 \ub370\uc774\ud130\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\ub2e4\uba74?<\/p>\n<p>\uadf8\ub798\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc\ub97c \ub9cc\ub4e4\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">MutableLiveData&lt;Void&gt; startSomething = new MutableLiveData&lt;&gt;();\r\nstartSomething.setValue(null);<\/pre>\n<p>\uc774\ubca4\ud2b8\ub97c \ubc1c\uc0dd\uc2dc\ud0ac\ub54c\ub9c8\ub2e4 null\uc744 \ub123\ub294\uac83\uc774\uc9c0\uc694. \uadf8\ub7ec\uba74 \uc774 LiveData\ub97c observe\ud558\uace0 \uc788\ub358 Activity\ub294 ViewModel\uc758 \uc774\ubca4\ud2b8\ub97c \uac10\uc9c0\ud558\uace0 \uc5b4\ub5a4 \ub3d9\uc791\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \ubcf4\uae30\ub294 \uc88b\uc9c0 \uc54a\ub124\uc694.<\/p>\n<p><iframe loading=\"lazy\" width=\"480\" height=\"270\" src=\"https:\/\/giphy.com\/embed\/xT1R9YUaUwR49MdDLa\" frameborder=\"0\" class=\"giphy-embed\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>\uad6c\uae00 \uc0d8\ud50c \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc774\ub7f0\uc2dd\uc73c\ub85c \ud574\uacb0\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">public class SingleLiveEvent&lt;T&gt; extends MutableLiveData&lt;T&gt; {\r\n\r\n    private static final String TAG = \"SingleLiveEvent\";\r\n\r\n    private final AtomicBoolean mPending = new AtomicBoolean(false);\r\n\r\n    @MainThread\r\n    public void observe(LifecycleOwner owner, final Observer&lt;T&gt; observer) {\r\n\r\n        if (hasActiveObservers()) {\r\n            Log.w(TAG, \"Multiple observers registered but only one will be notified of changes.\");\r\n        }\r\n\r\n        \/\/ Observe the internal MutableLiveData\r\n        super.observe(owner, new Observer&lt;T&gt;() {\r\n            @Override\r\n            public void onChanged(@Nullable T t) {\r\n                if (mPending.compareAndSet(true, false)) {\r\n                    observer.onChanged(t);\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    @MainThread\r\n    public void setValue(@Nullable T t) {\r\n        mPending.set(true);\r\n        super.setValue(t);\r\n    }\r\n\r\n    \/**\r\n     * Used for cases where T is Void, to make calls cleaner.\r\n     *\/\r\n    @MainThread\r\n    public void call() {\r\n        setValue(null);\r\n    }\r\n}<\/pre>\n<p><a href=\"https:\/\/github.com\/googlesamples\/android-architecture\/blob\/dev-todo-mvvm-live\/todoapp\/app\/src\/main\/java\/com\/example\/android\/architecture\/blueprints\/todoapp\/SingleLiveEvent.java\">SingleLiveEvent<\/a>\ub77c\ub294 MutableLiveData\ub97c \uc0c1\uc18d\ud55c \ud074\ub798\uc2a4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.<br \/>\n\uc774\ubca4\ud2b8\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uae30 \uc704\ud574\uc11c \ub370\uc774\ud130\ub97c \ubcc0\uacbd \uc2dc\ud0a4\ub294 \ub85c\uc9c1\uc744 \ub0b4\ubd80\uc5d0 \ub450\uace0 \uc678\ubd80\uc5d0\uc11c\ub294 call()\uc744 \ud638\ucd9c\ud558\ub3c4\ub85d \ud558\ub294\uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub9cc\uc57d \ud568\uc218\uc758 \ud30c\ub77c\ubbf8\ud130\uac00 \ud544\uc694\ud558\ub2e4\uba74 \uc81c\ub124\ub9ad T\ub97c \uc815\uc758\ud558\uace0 setValue()\ub97c \uc774\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>SingleLiveEvent\ub97c \uac1c\uc120\ud55c \ub0b4\uc6a9\uc744 \ud655\uc778\ud558\uc2dc\ub824\uba74 <a href=\"https:\/\/www.charlezz.com\/?p=44609\">\ub2e4\uc74c \ud3ec\uc2a4\ud305<\/a>\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694<\/p>\n","protected":false},"excerpt":{"rendered":"<p>AAC lifecycle\ucef4\ud3ec\ub10c\ud2b8\uc758 \ub4f1\uc7a5\uacfc \ud568\uaed8 MVVM\ud328\ud134\uc774 \ub2e4\uc18c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uae30\uc874\uc758 \ubc29\uc2dd\uc740 \ub2e4\uc74c \uadf8\ub9bc\uacfc \uac19\uc2b5\ub2c8\ub2e4. Activity\uc640 ViewModel\uc758 \uc758\uc874\uc131\uc744 \ubd84\ub9ac\ud558\uace0 ViewModel\uc740 Navigator\ub97c \uc774\uc6a9\ud558\uc5ec Activity\uc5d0\uac8c \uc774\ubca4\ud2b8\ub97c \uc804\ub2ec\ud569\ub2c8\ub2e4. Navigator\uc758 \uad6c\ud604\uccb4\ub294 \ubcf4\ud1b5 Activity\uac00 \ub418\uace4\ud588\uc5c8\uc2b5\ub2c8\ub2e4. BaseObservable\uc744 \uc0c1\uc18d\ubc1b\uc544 ViewModel\uc744 \ub9cc\ub4e4\uba74 \ub370\uc774\ud130\ubc14\uc778\ub529 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc640 \uad81\ud569\ub3c4 \uc798\ub9de\uc2b5\ub2c8\ub2e4. \uadf8\ub7f0\ub370, AAC ViewModel\uc744 \uc0ac\uc6a9\ud558\uace0 \ubd80\ud130\ub294 \uc774 \ud328\ud134\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4. Caution:\u00a0A\u00a0ViewModel\u00a0must never reference a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[16],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1152"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1152"}],"version-history":[{"count":5,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1152\/revisions"}],"predecessor-version":[{"id":44610,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1152\/revisions\/44610"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}