{"id":46044,"date":"2022-04-11T18:09:01","date_gmt":"2022-04-11T09:09:01","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=46044"},"modified":"2022-04-11T18:09:03","modified_gmt":"2022-04-11T09:09:03","slug":"%ec%83%9d%eb%aa%85%ec%a3%bc%ea%b8%b0%ec%97%90-%eb%a7%9e%ec%b6%b0-%ec%95%88%ec%a0%84%ed%95%98%ea%b2%8c-%ec%bd%94%eb%a3%a8%ed%8b%b4-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=46044","title":{"rendered":"\uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \uc548\uc804\ud558\uac8c \ucf54\ub8e8\ud2f4 \uc0ac\uc6a9\ud558\uae30"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\uc0dd\uba85\uc8fc\uae30\uc5d0 \uc548\uc804\ud55c \ucf54\ub8e8\ud2f4<\/h2>\n\n\n\n<p>lifecycle \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74, \uc0dd\uba85\uc8fc\uae30\ub97c \uc778\uc2dd\ud558\ub294 \ucf54\ub8e8\ud2f4\uc744 \ub9cc\ub4e4 \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p> LifecycleOwner\ub85c\uc368 \ucde8\uae09\ub418\ub294 AppCompatActivity(ComponentActivity) \ub610\ub294 Fragment\ub97c \uc77c\ubc18\uc801\uc73c\ub85c \uc0ac\uc6a9\ud560 \ub54c lifecycle \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc0ac\uc6a9\ud558\uac8c \ub418\ub294\ub370 \uc774\ub54c <strong>lifecycleScope<\/strong>\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>\uc77c\ubc18\uc801\uc740 \ucf54\ub8e8\ud2f4 \uc2a4\ucf54\ud504\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c launch\ub97c async\uc640 \uac19\uc740 \ud568\uc218 \ud638\ucd9c\uc744 \ud1b5\ud574 suspendable \ud55c \uc791\uc5c5\uc744 \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">lifecycleScope.launch {\n    \/\/ \ucf54\ub8e8\ud2f4 \uc791\uc5c5\n}<\/pre>\n\n\n\n<p>\ub9cc\uc57d Fragment \ub610\ub294 Activity\uc640 \uac19\uc740 \uc77c\ubc18\uc801\uc778 \ucf54\ub8e8\ud2f4 \uc2a4\ucf54\ud504\ub97c \ub9cc\ub4e4\uc5b4 \uc791\uc5c5\uc911\uc774\ub77c\uba74, LifecycleOwner\uac00 Destoryed \ub420 \ub54c \uc2e4\ud589\uc911\uc778 \ucf54\ub8e8\ud2f4\uc744 \ucde8\uc18c\ud558\uae30 \uc704\ud574 \uba85\uc2dc\uc801\uc73c\ub85c CoroutineContext.cancel()\uc744 \ud638\ucd9c\ud574\uc918\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p>\ud558\uc9c0\ub9cc, lifecycleScope\uc5d0\uc11c \uc2e4\ud589\ud558\ub294 \ucf54\ub8e8\ud2f4\uc740 \uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \uc548\uc804\ud558\uac8c \uc885\ub8cc\ub418\ubbc0\ub85c \uc548\uc804\ud558\ub2e4. \uadf8 \uc774\uc720\ub294 LifecycleCoroutineScopeImpl \ucf54\ub4dc \ub0b4\ubd80\ub97c \uc0b4\ud3b4\ubcf4\uba74 \uc9d0\uc791\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>internal class LifecycleCoroutineScopeImpl(\n    override val lifecycle: Lifecycle,\n    override val coroutineContext: CoroutineContext\n) : LifecycleCoroutineScope(), LifecycleEventObserver {\n    init {\n        \/\/ in case we are initialized on a non-main thread, make a best effort check before\n        \/\/ we return the scope. This is not sync but if developer is launching on a non-main\n        \/\/ dispatcher, they cannot be 100% sure anyways.\n        if (lifecycle.currentState == Lifecycle.State.DESTROYED) {\n            <strong>coroutineContext.cancel()<\/strong>\n        }\n    }\n\n    fun register() {\n        launch(Dispatchers.Main.immediate) {\n            if (lifecycle.currentState >= Lifecycle.State.INITIALIZED) {\n                lifecycle.addObserver(this@LifecycleCoroutineScopeImpl)\n            } else {\n                <strong>coroutineContext.cancel()<\/strong>\n            }\n        }\n    }\n\n    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {\n        if (lifecycle.currentState &lt;= Lifecycle.State.DESTROYED) {\n            lifecycle.removeObserver(this)\n            <strong>coroutineContext.cancel()<\/strong>\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>Activity \ub610\ub294 Fragment\uc758 \uc0dd\uba85\uc8fc\uae30 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544\uc11c \ud30c\uad34\ub418\uc5c8\ub2e4\uace0 \ud310\ub2e8\ud558\uba74, \ud558\uc704 \ucf54\ub8e8\ud2f4 \uc791\uc5c5\ub4e4\uc744 \ucde8\uc18c\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>Note: ViewModel\uc758 \uacbd\uc6b0 \ubcc4\ub3c4\uc758 \uc0dd\uba85\uc8fc\uae30\ub97c \uac16\ub294\ub370, lifecycleScope\ub300\uc2e0 viewModelScope\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \ucf54\ub8e8\ud2f4 \uc2e4\ud589\ud558\uae30<\/h2>\n\n\n\n<p>\uc0dd\uba85\uc8fc\uae30\ub97c \uc778\uc2dd\ud558\ub294 \uba87\uac00\uc9c0 \ucf54\ub8e8\ud2f4 \ud568\uc218\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">whenXXX \ud568\uc218<\/h3>\n\n\n\n<p>\uc0dd\uba85\uc8fc\uae30\uac00 \ud2b9\uc815 \uc0c1\ud0dc\uc5d0 \uc788\uc9c0 \uc54a\ub2e4\uba74 \ucf54\ub8e8\ud2f4\uc758 \uc2e4\ud589\uc744 \uc815\uc9c0\ud558\uace0 \uc2f6\uc744 \ub54c\uac00 \uc788\uc744 \uc218 \uc788\ub2e4.  whenCreated, <meta charset=\"utf-8\">whenStarted, whenResumed 3\uac00\uc9c0 \ud568\uc218\uac00 \uc788\uc73c\uba70 \uc774\ub984\uc5d0\uc11c \uc54c \uc218 \uc788\ub4ef\uc774, \uac01 \ud568\uc218 when\uc774\ud6c4 \uc811\ubbf8\uc5b4\uc5d0 \ud574\ub2f9\ud558\ub294 \uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \uc2e4\ud589\uc774\ub418\uace0, \uc0dd\uba85\uc8fc\uae30\uc758 \uc0c1\ud0dc\uac00 \ucda9\uc871\ub418\uc9c0 \uc54a\uc73c\uba74 \uc815\uc9c0\uac00 \ub418\ub294 \ub611\ub611\ud55c \ud568\uc218\ub2e4. \ub2e4\uc74c \uc608\uc81c\ucf54\ub4dc\ub294 \uc0dd\uba85\uc8fc\uae30 \uc0c1\ud0dc\uac00 \ucd5c\uc18c STARTED \uc0c1\ud0dc\uc77c \ub54c \uc2e4\ud589\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MainActivity : AppCompatActivity() {\n\n    val TAG = \"Charlezz\"\n\n    val counterFlow:Flow&lt;Int> = flow{\n        var counter = 0\n        while(true){\n            delay(1000)\n            emit(counter++)\n        }\n    }\n    \n    override fun onCreated(savedInstanceState: Bundle?) {\n        lifecycleScope.launch {\n            <strong>whenStarted<\/strong> {\n                counterFlow.collect {\n                    Log.e(TAG, \"$it\")\n                }\n            }\n        }\n    }\n\n}<\/code><\/pre>\n\n\n\n<p>\uc704 \uc608\uc81c \ucf54\ub4dc\ub97c \uc2e4\ud589\ud55c \ub4a4 \uc911\uac04\uc5d0 \ud648\ubc84\ud2bc\uc744 \ub20c\ub7ec \uc571\uc744 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc0c1\ud0dc\ub85c \ub9cc\ub4e4\uace0 \ub2e4\uc2dc \uc571\uc73c\ub85c \uc9c4\uc785\ud558\uc5ec \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc \uc0c1\ud0dc\ub85c \ub9cc\ub4e4 \ub54c \uc5b4\ub5a0\ud55c \ubcc0\ud654\uac00 \ub85c\uadf8\uc5d0 \uc5b4\ub5a4 \ubcc0\ud654\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>E\/Charlezz: 0\n<meta charset=\"utf-8\">E\/Charlezz: 1\n<meta charset=\"utf-8\">E\/Charlezz: 2\n<meta charset=\"utf-8\">E\/Charlezz: 3\n(\ud648\ubc84\ud2bc \ub20c\ub7ec \ube60\uc838\ub098\uc634, \ub354 \uc774\uc0c1 \ub85c\uadf8\uac00 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc74c)\n.\n.\n.\n(\uc218\ucd08\ud6c4\uc5d0 \ub2e4\uc2dc \uc571\uc73c\ub85c \uc9c4\uc785)\n<meta charset=\"utf-8\">E\/Charlezz: 4\n<meta charset=\"utf-8\">E\/Charlezz: 5\n<meta charset=\"utf-8\">E\/Charlezz: 6\n<meta charset=\"utf-8\">E\/Charlezz: 7\n<meta charset=\"utf-8\">E\/Charlezz: 8\n.\n.\n.<\/code><\/pre>\n\n\n\n<p>\ub85c\uadf8\uc5d0\uc11c \uc54c \uc218 \uc788\ub4ef\uc774 \uc0dd\uba85\uc8fc\uae30\uc758 \ucd5c\uc18c\uc0c1\ud0dc\ub97c \ucda9\uc871\ud558\uc9c0 \ubabb\ud558\uba74 \uc791\uc5c5\ud558\ub358 \ucf54\ub8e8\ud2f4\uc744 \uc815\uc9c0\uc0c1\ud0dc(suspended)\ub85c \ub9cc\ub4e4\uace0, \ub2e4\uc2dc \uc0dd\uba85\uc8fc\uae30\uac00 \ucda9\uc871\ub418\uba74 \uc7ac\uac1c(Resumed)\ub41c\ub2e4.<\/p>\n\n\n\n<p>launch \ube14\ub85d\ub0b4\uc5d0\uc11c whenXXX \ud568\uc218\ub97c \ud638\ucd9c\ud558\ub294 \ub300\uc2e0 \ub2e4\uc74c\uacfc \uac19\uc774 <strong>lifecycleScope.launchWhenXXX<\/strong> \ud568\uc218 \ud55c\uc904\ub85c \uac04\ub2e8\ud788 \ud45c\ud604\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MyFragment: Fragment {\n    init {\n        lifecycleScope.<strong>launchWhenStarted<\/strong> {\n            try {\n                \/\/ \uc815\uc9c0 \uac00\ub2a5\ud55c \ud568\uc218 \ud638\ucd9c \n            } finally {\n                \/\/ \uc774 \ub77c\uc778\uc740 \uc544\ub9c8 \uc0dd\uba85\uc8fc\uae30\uac00 DESTROYED\uac00 \ub420 \ub54c \uc2e4\ud589\ub41c\ub2e4.\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \ucf54\ub8e8\ud2f4 \uc7ac\uc2dc\uc791\ud558\uae30 <\/h2>\n\n\n\n<p>whenXXX \ud568\uc218 \ud638\ucd9c\uc744 \ud1b5\ud574 \uc790\ub3d9\uc73c\ub85c \uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \ucf54\ub8e8\ud2f4\uc744 <strong>\uc2dc\uc791\/\uc911\ub2e8\/\uc7ac\uac1c<\/strong> \ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uc558\ub2e4. \ud558\uc9c0\ub9cc \uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \ucf54\ub8e8\ud2f4\uc744 <strong>\uc2dc\uc791\/\ucde8\uc18c\/\uc7ac\uc2dc\uc791<\/strong> \ud558\uace0 \uc2f6\uc744 \ub54c\uac00 \uc788\ub2e4. \uc774\ub7ec\ud55c \uacbd\uc6b0 Lifecycle\uacfc LifecycleOwner\ub294 repeatOnLifecycle\uc774\ub77c\ub294 \ud655\uc7a5\ud568\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4. \ub2e4\uc74c \uc608\uc81c\ub294 \uc0dd\uba85\uc8fc\uae30 \uc0c1\ud0dc\uac00 STARTED\uc77c \ub54c\ub9c8\ub2e4 \uc0c8\ub85c\uc6b4 \uc2a4\ud2b8\ub9bc\uc744 \uc218\uc9d1\ud558\ub294 \uac83\uc744 \ubcf4\uc5ec\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><meta charset=\"utf-8\">class MainActivity : AppCompatActivity() {\n\n    val TAG = \"Charlezz\"\n\n    val counterFlow:Flow&lt;Int> = flow{\n        var counter = 0\n        while(true){\n            delay(1000)\n            emit(counter++)\n        }\n    }\n    \n    override fun onCreated(savedInstanceState: Bundle?) {\n        lifecycleScope.launch {\n            <strong>repeatOnLifecycle<\/strong>(Lifecycle.State.STARTED){\n                counterFlow.collect {\n                    Log.e(TAG, \"$it\")\n                }\n            }\n        }\n    }\n\n}<\/code><\/pre>\n\n\n\n<p><meta charset=\"utf-8\"><meta charset=\"utf-8\">\uc774\ubc88\uc5d0\ub3c4 \uc608\uc81c \ucf54\ub4dc\ub97c \uc2e4\ud589\ud55c \ub4a4 \uc911\uac04\uc5d0 \ud648\ubc84\ud2bc\uc744 \ub20c\ub7ec \uc571\uc744 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc0c1\ud0dc\ub85c \ub9cc\ub4e4\uace0 \ub2e4\uc2dc \uc571\uc73c\ub85c \uc9c4\uc785\ud558\uc5ec \ud3ec\uc5b4\uadf8\ub77c\uc6b4\ub4dc \uc0c1\ud0dc\ub85c \ub9cc\ub4e4 \ub54c \uc5b4\ub5a0\ud55c \ubcc0\ud654\uac00 \ub85c\uadf8\uc5d0 \uc5b4\ub5a4 \ubcc0\ud654\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><meta charset=\"utf-8\">E\/Charlezz: 0\n<meta charset=\"utf-8\">E\/Charlezz: 1\n<meta charset=\"utf-8\">E\/Charlezz: 2\n<meta charset=\"utf-8\">E\/Charlezz: 3\n(\ud648\ubc84\ud2bc \ub20c\ub7ec \ube60\uc838\ub098\uc634, \ub354 \uc774\uc0c1 \ub85c\uadf8\uac00 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc74c)\n.\n.\n.\n(\uc218\ucd08\ud6c4\uc5d0 \ub2e4\uc2dc \uc571\uc73c\ub85c \uc9c4\uc785)\n<meta charset=\"utf-8\">E\/Charlezz: <meta charset=\"utf-8\">0\n<meta charset=\"utf-8\">E\/Charlezz: 1\n<meta charset=\"utf-8\">E\/Charlezz: 2\n<meta charset=\"utf-8\">E\/Charlezz: 3\n<meta charset=\"utf-8\">E\/Charlezz: 4\n.\n.\n.<\/code><\/pre>\n\n\n\n<p>\uc0dd\uba85\uc8fc\uae30\ub97c \ucda9\uc871\ud558\uc9c0 \ubabb\ud560 \ub54c \uc2e4\ud589\ud558\ub358 \ucf54\ub8e8\ud2f4\uc740 \ucde8\uc18c\ud558\uace0, \uc0dd\uba85\uc8fc\uae30\uac00 \ucda9\uc871\ub420 \ub54c \ub2e4\uc2dc \ucc98\uc74c\ubd80\ud130 \uc791\uc5c5\uc744 \ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc0dd\uba85\uc8fc\uae30\uc5d0 \uc548\uc804\ud55c \ucf54\ub8e8\ud2f4 lifecycle \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uba74, \uc0dd\uba85\uc8fc\uae30\ub97c \uc778\uc2dd\ud558\ub294 \ucf54\ub8e8\ud2f4\uc744 \ub9cc\ub4e4 \uc218 \uc788\ub2e4. LifecycleOwner\ub85c\uc368 \ucde8\uae09\ub418\ub294 AppCompatActivity(ComponentActivity) \ub610\ub294 Fragment\ub97c \uc77c\ubc18\uc801\uc73c\ub85c \uc0ac\uc6a9\ud560 \ub54c lifecycle \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc0ac\uc6a9\ud558\uac8c \ub418\ub294\ub370 \uc774\ub54c lifecycleScope\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \uc77c\ubc18\uc801\uc740 \ucf54\ub8e8\ud2f4 \uc2a4\ucf54\ud504\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c launch\ub97c async\uc640 \uac19\uc740 \ud568\uc218 \ud638\ucd9c\uc744 \ud1b5\ud574 suspendable \ud55c \uc791\uc5c5\uc744 \ud560 \uc218 \uc788\ub2e4. lifecycleScope.launch { \/\/ \ucf54\ub8e8\ud2f4 \uc791\uc5c5 [&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":[5],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/46044"}],"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=46044"}],"version-history":[{"count":1,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/46044\/revisions"}],"predecessor-version":[{"id":46045,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/46044\/revisions\/46045"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=46044"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=46044"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=46044"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}