{"id":283,"date":"2018-05-01T22:01:37","date_gmt":"2018-05-01T13:01:37","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=283"},"modified":"2019-08-18T22:28:20","modified_gmt":"2019-08-18T13:28:20","slug":"reactive-programing4-scheduler","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=283","title":{"rendered":"Reactive Programing(4) \u2013 Scheduler"},"content":{"rendered":"<h1><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1000\/1*NkhhBPaaZXD9NSYC_xQ0LA.png\" width=\"1000\" height=\"562\" \/><\/h1>\n<h1><\/h1>\n<hr \/>\n<p><a href=\"https:\/\/www.charlezz.com\/?p=189\">Reactive Programing(1) &#8211; \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \uac1c\ub150\uc7a1\uae30<\/a><br \/>\n<a class=\"row-title\" href=\"https:\/\/www.charlezz.com\/?p=242\" aria-label=\"\u201cReactive Programing(2) \u2013 Reactive Operator\u201d (\ud3b8\uc9d1)\">Reactive Programing(2) \u2013 Reactive Operator<\/a><br \/>\n<a class=\"row-title\" href=\"https:\/\/www.charlezz.com\/?p=264\" aria-label=\"\u201cReactive Programing(3) \u2013 Reactive Operator\u201d (\ud3b8\uc9d1)\">Reactive Programing(3) \u2013 Reactive Operator<\/a><br \/>\nReactive Programing(4) \u2013 Scheduler<br \/>\n<a class=\"row-title\" href=\"https:\/\/www.charlezz.com\/?p=299\" aria-label=\"\u201cReactive Programing(5) \u2013 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\uc758 RxJava \ud65c\uc6a9\u201d (\ud3b8\uc9d1)\">Reactive Programing(5) \u2013 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\uc758 RxJava \ud65c\uc6a9<\/a><\/p>\n<hr \/>\n<h1>Scheduler<\/h1>\n<h2>\uc2a4\ucf00\uc904\ub7ec \uac1c\ub150 \uc775\ud788\uae30<\/h2>\n<p>\uc9c0\uae08\uae4c\uc9c0\uc758 \uc608\uc81c\ub4e4\uc740 \ub300\ubd80\ubd84 MainThread\uc5d0\uc11c \ub3d9\uc791 \ud588\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\uac8c \ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc6a9\ud558\ub294\uac83\uc774 \ubc14\ub85c \uc2a4\ucf00\uc974\ub7ec\uc785\ub2c8\ub2e4.<br \/>\n\uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"\">    Observable.just(1, 2, 3, 4, 5)\r\n            .doOnNext { println(\"doOnNext:$it\") }\r\n            .subscribeOn(Schedulers.newThread())\r\n\/\/          .observeOn(Schedulers.newThread()) \/\/\uc8fc\uc11d\uc744 \ud480\uba74?\r\n            .subscribe {\r\n               println(\"$it\")\r\n            }\r\n      Thread.sleep(1000)<\/pre>\n<p>\uacb0\uacfc:<br \/>\ndoOnNext:1<br \/>\n1<br \/>\ndoOnNext:2<br \/>\n2<br \/>\ndoOnNext:3<br \/>\n3<br \/>\ndoOnNext:4<br \/>\n4<br \/>\ndoOnNext:5<br \/>\n5<br \/>\n\u00a0<br \/>\n\uc8fc\uc11d\uc744 \ud480\uc5c8\uc744 \ub54c<\/p>\n<pre class=\"\">Observable.just(1, 2, 3, 4, 5)\r\n      .doOnNext { println(\"doOnNext:$it\") }\r\n      .subscribeOn(Schedulers.newThread())\r\n      .observeOn(Schedulers.newThread())\r\n      .subscribe {\r\n         println(\"$it\")\r\n      }\r\nThread.sleep(1000)<\/pre>\n<p>\uacb0\uacfc:<br \/>\ndoOnNext:1<br \/>\ndoOnNext:2<br \/>\ndoOnNext:3<br \/>\ndoOnNext:4<br \/>\ndoOnNext:5<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n\u00a0<br \/>\ndoOnNext\ub294 onNext\uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud558\uba74 \uc2e4\ud589\ub418\uace0 \ub370\uc774\ud130\uac12\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\nsubscribeOn\uacfc observeOn\uc740 \uac01\uac01 \uad6c\ub3c5\uacfc \ubc1c\ud589\uc2dc \uc0ac\uc6a9\ud558\ub294 \uc2a4\ub808\ub4dc\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\nSchdulers.newThread()\ub294 \uc0c8\ub85c\uc6b4 \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\ub370\uc774\ud130\ub97c \ubc1c\ud589\ud558\ub294 \uc2a4\ub808\ub4dc\uc640 \uad6c\ub3c5\ud558\ub294 \uc2a4\ub808\ub4dc\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 \uc704\uc758 \uc608\uc81c\ucc98\ub7fc \ub370\uc774\ud130\uc758 \ud750\ub984\uc774 \ubc14\ub00c\ub294\uac83\uc744 \ud655\uc778 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\u00a0<\/p>\n<h2>\uc2a4\ucf00\uc904\ub7ec\uc758 \uc885\ub958<\/h2>\n<table id=\"tablepress-6\" class=\"tablepress tablepress-id-6\">\n<tbody>\n<tr class=\"row-1\">\n<td class=\"column-1\">RxJava 2.x<\/td>\n<td class=\"column-2\">fromArray, fromCallable, fromFuture, fromIterable, fromPublisher<\/td>\n<\/tr>\n<tr class=\"row-2\">\n<td class=\"column-1\">RxKotlin<\/td>\n<td class=\"column-2\">asObservable, from<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><!-- #tablepress-6 from cache --><br \/>\n\u00a0<\/p>\n<h3>1. newThread() \uc2a4\ucf00\uc974\ub7ec<\/h3>\n<p>&nbsp;<\/p>\n<pre class=\"\">       val array = arrayOf(\"1\", \"2\", \"3\")\r\n      array.toObservable()\r\n            .doOnNext { println(\"doOnNext:$it\") }\r\n            .map { \"($it)\" }\r\n\/\/          .subscribeOn(Schedulers.newThread())\r\n            .subscribe{\r\n               println(it)\r\n               Thread.sleep(100)\r\n            }\r\n      array.toObservable()\r\n            .doOnNext { println(\"doOnNext:$it\") }\r\n            .map { \"&lt;$it&gt;\" }\r\n\/\/          .subscribeOn(Schedulers.newThread())\r\n            .subscribe{\r\n               println(it)\r\n               Thread.sleep(100)\r\n            }\r\n      Thread.sleep(1000)<\/pre>\n<p>\u00a0<br \/>\n\uacb0\uacfc:<br \/>\ndoOnNext:1<br \/>\n(1)<br \/>\ndoOnNext:2<br \/>\n(2)<br \/>\ndoOnNext:3<br \/>\n(3)<br \/>\ndoOnNext:1<br \/>\n&lt;1&gt;<br \/>\ndoOnNext:2<br \/>\n&lt;2&gt;<br \/>\ndoOnNext:3<br \/>\n&lt;3&gt;<br \/>\n\u00a0<br \/>\n\uc5bc\ud54f \ubcf4\uae30\uc5d0 \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc9c0\uc815\ud558\ub098 \uc548\ud558\ub098 \uacb0\uacfc\uac00 \ub611\uac19\uc544 \ubcf4\uc785\ub2c8\ub2e4.<br \/>\n\uc5ec\uae30\uc11c Thread.sleep\uc744 \ube7c\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<br \/>\n\u00a0<\/p>\n<pre class=\"\">val array = arrayOf(\"1\", \"2\", \"3\")\r\n      array.toObservable()\r\n            .doOnNext { println(\"doOnNext:$it\") }\r\n            .map { \"($it)\" }\r\n            .subscribeOn(Schedulers.newThread())\r\n            .subscribe{\r\n               println(it)\r\n               Thread.sleep(100)\r\n            }\r\n      array.toObservable()\r\n            .doOnNext { println(\"doOnNext:$it\") }\r\n            .map { \"&lt;$it&gt;\" }\r\n            .subscribeOn(Schedulers.newThread())\r\n            .subscribe{\r\n               println(it)\r\n               Thread.sleep(100)\r\n            }\r\n      Thread.sleep(1000)<\/pre>\n<p>\u00a0<br \/>\n\uacb0\uacfc:<br \/>\ndoOnNext:1<br \/>\ndoOnNext:1<br \/>\n&lt;1&gt;<br \/>\n(1)<br \/>\ndoOnNext:2<br \/>\ndoOnNext:2<br \/>\n&lt;2&gt;<br \/>\n(2)<br \/>\ndoOnNext:3<br \/>\ndoOnNext:3<br \/>\n&lt;3&gt;<br \/>\n(3)<br \/>\n\uac19\uc740 Observable\uc774\uc9c0\ub9cc \uc11c\ub85c\ub2e4\ub978 \uc2a4\ub808\ub4dc\ub85c \uad6c\ub3c5\uc744 \ud558\uace0 \uc788\uae30\ub54c\ubb38\uc5d0 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ucc98\ub9ac\ub97c \ud558\uac8c \ub429\ub2c8\ub2e4.<br \/>\n\ud558\uc9c0\ub9cc \uc774\ub294 \ucd94\ucc9c\ud558\ub294 \ubc29\ubc95\uc774 \uc544\ub2c8\uba70 \ud2b9\uc218\ud55c \uc0c1\ud669\uc5d0\uc11c\ub9cc \uc0ac\uc6a9\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<br \/>\n\ub2e4\ub978 \ud65c\uc6a9\ub3c4\uac00 \uc88b\uc740 \uc2a4\ucf00\uc974\ub7ec \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>2. computation() \uc2a4\ucf00\uc974\ub7ec<\/h3>\n<p>\ube60\ub974\uac8c \uacc4\uc0b0\ud558\uc5ec \uacb0\uacfc\ub97c \ub3c4\ucd9c\ud558\ub294\ub370 \uc9d1\uc911\ud558\ub294 \uc2a4\ucf00\uc904\ub7ec\uc785\ub2c8\ub2e4. \uacc4\uc0b0 \uc2a4\ucf00\uc904\ub7ec\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c \uc2a4\ub808\ub4dc \ud480\uc744 \uc0dd\uc131\ud558\uc5ec \ud504\ub85c\uc138\uc11c \uac1c\uc218\ub9cc\ud07c \uc2a4\ub808\ub4dc\ub97c \ub9cc\ub4e4\uc5b4 \ucc98\ub9ac\ud569\ub2c8\ub2e4.<br \/>\n\uc2a4\ub808\ub4dc\uac00 \ucf54\uc5b4\ub97c \ubaa8\ub450 \uc810\uc720\ud558\uace0 \uc788\ub294 \uacbd\uc6b0\uc5d0\ub294 \ub300\uae30\uc5f4\uc5d0 \ub4e4\uc5b4\uac11\ub2c8\ub2e4.<br \/>\n\u00a0<\/p>\n<pre class=\"\">val array = arrayOf(\"1\", \"2\", \"3\")\r\nval source = array.toObservable()\r\n      .zipWith(Observable.interval(100L, TimeUnit.MILLISECONDS), BiFunction { number: String, _: Long -&gt;\r\n         number\r\n      })\r\nsource.map { \"&lt;${it}&gt;\" }\r\n      .subscribeOn(Schedulers.computation())\r\n      .subscribe { println(\"${Thread.currentThread().name}:$it\") }\r\nsource.map { \"(${it})\" }\r\n      .subscribeOn(Schedulers.computation())\r\n      .subscribe { println(\"${Thread.currentThread().name}:$it\") }\r\nThread.sleep(1000)<\/pre>\n<p>\uacb0\uacfc:<br \/>\nRxComputationThreadPool-3:&lt;1&gt;<br \/>\nRxComputationThreadPool-4:(1)<br \/>\nRxComputationThreadPool-4:(2)<br \/>\nRxComputationThreadPool-3:&lt;2&gt;<br \/>\nRxComputationThreadPool-3:&lt;3&gt;<br \/>\nRxComputationThreadPool-4:(3)<br \/>\n\u00a0<br \/>\n\uac04\ud639 \uccab\ubc88\uc9f8 \uad6c\ub3c5\uc774 \ube60\ub974\uac8c \ub05d\ub098 \uc544\ub798\uc640\uac19\uc774 \ub3d9\uc77c\ud55c \uc2a4\ub808\ub4dc\uac00 \ucc98\ub9ac\ud558\ub294 \uacbd\uc6b0\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\nRxComputationThreadPool-3:&lt;1&gt;<br \/>\nRxComputationThreadPool-3:(1)<br \/>\nRxComputationThreadPool-3:&lt;2&gt;<br \/>\nRxComputationThreadPool-3:(2)<br \/>\nRxComputationThreadPool-3:&lt;3&gt;<br \/>\nRxComputationThreadPool-3:(3)<br \/>\n\u00a0<br \/>\n\uc0ac\uc2e4 interval()\ud568\uc218\uac00 \uc774\ubbf8 Computation\uc2a4\ub808\ub4dc\ub97c \uc4f0\uace0 \uc788\uc5b4 \ub530\ub85c \uc2a4\ucf00\uc904\ub7ec\ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uacb0\uacfc\ub294 \uac19\uc2b5\ub2c8\ub2e4.<br \/>\n3. Trampoline \uc2a4\ucf00\uc904\ub7ec<br \/>\n\uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc9c0 \uc54a\uace0 \ubb34\ud55c\ud55c \ud06c\uae30\uc758 \ub300\uae30 Queue\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\u00a0<\/p>\n<pre class=\"\">val array = arrayOf(\"1\", \"2\", \"3\")\r\nval source = array.toObservable()\r\nsource.map { \"&lt;${it}&gt;\" }\r\n      .subscribeOn(Schedulers.trampoline())\r\n      .subscribe { println(\"${Thread.currentThread().name}:$it\") }\r\nsource.map { \"(${it})\" }\r\n      .subscribeOn(Schedulers.trampoline())\r\n      .subscribe { println(\"${Thread.currentThread().name}:$it\") }<\/pre>\n<p>\uacb0\uacfc:<br \/>\nmain:&lt;1&gt;<br \/>\nmain:&lt;2&gt;<br \/>\nmain:&lt;3&gt;<br \/>\nmain:(1)<br \/>\nmain:(2)<br \/>\nmain:(3)<br \/>\n\u00a0<br \/>\n\uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc9c0 \uc54a\uace0 MainThread\uc5d0\uc11c \ubaa8\ub450 \ucc98\ub9ac \ud569\ub2c8\ub2e4. \ud050\uc5d0 \ub123\uc740 \uc791\uc5c5\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\ubbc0\ub85c \uc2e4\ud589\uc21c\uc11c\uac00 \ubc14\ub00c\uc9c0\ub3c4 \uc54a\uc2b5\ub2c8\ub2e4.<br \/>\n\u00a0<\/p>\n<h3>4. SingleThread \uc2a4\ucf00\uc904\ub7ec<\/h3>\n<p>\ub0b4\ubd80\uc5d0\uc11c \ub2e8\uc77c \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc5ec \uad6c\ub3c5\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uc5ec\ub7ec\ubc88 \uad6c\ub3c5\uc774 \uc788\uc5b4\ub3c4 \uacf5\ud1b5\ub41c \uc2a4\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"\">Observable.range(0,5)\r\n      .subscribeOn(Schedulers.single())\r\n      .subscribe { println(\"${Thread.currentThread().name}:$it\") }\r\nObservable.range(1000,5)\r\n      .subscribeOn(Schedulers.single())\r\n      .subscribe { println(\"${Thread.currentThread().name}:$it\") }\r\nThread.sleep(1000)<\/pre>\n<p>\uacb0\uacfc:<br \/>\nRxSingleScheduler-1:0<br \/>\nRxSingleScheduler-1:1<br \/>\nRxSingleScheduler-1:2<br \/>\nRxSingleScheduler-1:3<br \/>\nRxSingleScheduler-1:4<br \/>\nRxSingleScheduler-1:1000<br \/>\nRxSingleScheduler-1:1001<br \/>\nRxSingleScheduler-1:1002<br \/>\nRxSingleScheduler-1:1003<br \/>\nRxSingleScheduler-1:1004<br \/>\n\u00a0<br \/>\ntrampoline\uacfc \ube44\uad50\ud558\uba74 \uba54\uc778\uc2a4\ub808\ub4dc\uac00 \uc544\ub2cc \uc2a4\ub808\ub4dc\uc5d0\uc11c \uadf8\ub9ac\uace0 \ub2e8\uc77c \uc2a4\ub808\ub4dc\uc5d0\uc11c \uad6c\ub3c5\uc744 \ucc98\ub9ac\ud55c\ub2e4\ub294 \uc0ac\uc2e4\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\u00a0<\/p>\n<h3>5. Executor \ubcc0\ud658 \uc2a4\ucf00\uc904\ub7ec<\/h3>\n<p>\uae30\uc874\uc5d0 \uc0ac\uc6a9\ud558\ub358 Java Executor \ud074\ub798\uc2a4\ub97c \uc7ac\uc0ac\uc6a9\ud560 \ub54c\ub9cc \ud55c\uc815\uc801\uc4f8 \uc218 \uc788\uc9c0\ub9cc \ub3d9\uc791\ubc29\uc2dd\uc774 \ub2e4\ub974\uae30\ub54c\ubb38\uc5d0 \ucd94\ucc9c\ud558\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"\">val list = arrayOf(1, 2, 3)\r\nval executor = Executors.newFixedThreadPool(10)\r\nlist.toObservable().subscribeOn(Schedulers.from(executor))\r\n      .subscribe { println(it) }\r\nlist.toObservable().subscribeOn(Schedulers.from(executor))\r\n      .subscribe { println(it) }<\/pre>\n<p>\uacb0\uacfc:<br \/>\n1<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n2<br \/>\n3<br \/>\nexecutor\ub294 10\uac1c\uc758 \uc2a4\ub808\ub4dc \ud480\uc744 \uc0dd\uc131\ud558\uace0 \uccab\ubc88\uc9f8\uc640 \ub450\ubc88\uc9f8 observable\uc5d0\uc11c \ubcc0\ud658\uc2a4\ucf00\uc904\ub7ec\ub97c \uc9c0\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\uc2a4\ucf00\uc904\ub7ec\ub97c \ud65c\uc6a9\ud55c \ucf5c\ubc31 \ud0c8\ucd9c<\/h2>\n<p>\uc774\ubc88 \uc608\uc81c\ub294 RxJava\ub97c \ud65c\uc6a9\ud558\uc5ec \uc5b4\ub5a4\uc2dd\uc73c\ub85c \ucf5c\ubc31\uc744 \ub2e4\ub8e8\ub294\uc9c0\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uc5f0\uc18d\uc801\uc778 \ub124\ud2b8\uc6cc\ud06c \uc694\uccad<\/h3>\n<p>\ub124\ud2b8\uc6cc\ud06c\uc758 \uacbd\uc6b0 OkHttp3\ub97c \uc774\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4.<br \/>\n\ucc38\uc870 \ub9c1\ud06c : <a href=\"http:\/\/square.github.io\/okhttp\/\">http:\/\/square.github.io\/okhttp\/<\/a><\/p>\n<ul>\n<li>\uc77c\ubc18\uc801\uc778 \uacbd\uc6b0\n<pre class=\"\">val url1 = \"https:\/\/raw.githubusercontent.com\/Charlezz\/RxJavaStudy\/master\/Sample\/first.txt\"\r\nval url2 = \"https:\/\/raw.githubusercontent.com\/Charlezz\/RxJavaStudy\/master\/Sample\/second.txt\"\r\nval client = OkHttpClient()\r\nval request1 = Request.Builder().url(url1).build()\r\nval request2 = Request.Builder().url(url2).build()\r\nclient.newCall(request1).enqueue(object : Callback {\r\n    override fun onFailure(call: Call?, e: IOException?) {\r\n        println(e?.message)\r\n    }\r\n    override fun onResponse(call: Call?, response: Response?) {\r\n        println(response?.body()?.string())\r\n        client.newCall(request2).enqueue(object : Callback {\r\n            override fun onFailure(call: Call?, e: IOException?) {\r\n                println(e?.message)\r\n            }\r\n            override fun onResponse(call: Call?, response: Response?) {\r\n                println(response?.body()?.string())\r\n            }\r\n        })\r\n    }\r\n})<\/pre>\n<p>onResponse \ucf5c\ubc31\ub0b4\uc5d0\uc11c \ub610 \ub2e4\ub978 call\uc744 \uc694\uccad\ud558\uace0 \uadf8\uc5d0 \ub530\ub978 \ub610 \ub2e4\ub978 \ucf5c\ubc31\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\ubb38\uc81c\ub294 \uc5c6\uc5b4\ubcf4\uc785\ub2c8\ub2e4. RxJava\uc758 \uacbd\uc6b0 \uc5b4\ub5bb\uac8c \ud574\uacb0\ud558\ub294\uc9c0 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li>RxJava\uc758 \uacbd\uc6b0\ubbf8\ub9ac get \ud638\ucd9c\uc6a9 \uba54\uc18c\ub4dc\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.\n<pre class=\"\">fun get(url: String): String? {\r\n    val client = OkHttpClient()\r\n    val request = Request.Builder()\r\n            .url(url)\r\n            .build()\r\n    return try {\r\n        client.newCall(request).execute().body()?.string()\r\n    } catch (e: Exception) {\r\n        e.message\r\n    }\r\n}<\/pre>\n<p>concat\ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \ub450\uac1c\uc758 Observable\uc774 \ub370\uc774\ud130\ub97c \uc21c\ucc28\uc801\uc73c\ub85c \ubc1c\ud589\ud558\uac8c \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"\">val url1 = \"https:\/\/raw.githubusercontent.com\/Charlezz\/RxJavaStudy\/master\/Sample\/first.txt\"\r\nval url2 = \"https:\/\/raw.githubusercontent.com\/Charlezz\/RxJavaStudy\/master\/Sample\/second.txt\"\r\nval src1 = Observable.just(url1).subscribeOn(Schedulers.io()).map(::get)\r\nval src2 = Observable.just(url2).subscribeOn(Schedulers.io()).map(::get)\r\nval start = System.currentTimeMillis()\r\nObservable.concat(src1, src2)\r\n        .subscribe {\r\n            println(it)\r\n        }<\/pre>\n<p>\uc77c\ubc18\uc801\uc778 \uc608\uc81c\uc640 RxJava\uc758 \ucc28\uc774\uac00 \ub290\uaef4\uc9c0\uc2dc\ub098\uc694?<br \/>\n\uac00\ub3c5\uc131 \uce21\uba74\uc774\ub098 \uc2a4\ub808\ub4dc \uad00\ub9ac\uc801\uc778 \uce21\uba74\uc5d0\uc11c \uc7a5\uc810\uc774 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\ub450\uac1c\uc758 url\uc744 Observable\uac1d\uccb4\ub85c \ub9cc\ub4e4\uc5b4 io\uc2a4\ucf00\uc904\ub7ec\ub97c \ud65c\uc6a9\ud558\uc5ec get\uba54\uc18c\ub4dc\ub97c \ud638\ucd9c \ud558\uac8c\uae08 \ud588\uc2b5\ub2c8\ub2e4.<br \/>\n\uc0ac\uc2e4 \uc704\uc758 \ucf54\ub4dc\ub3c4 \uc880 \uc544\uc26c\uc6b4\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 call\uc744 \ud558\uace0 \uc751\ub2f5\uc774 \ub4e4\uc5b4\uc640\uc57c \uadf8 \ub2e4\uc74c call\uc744 \ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc778\ub370,<br \/>\n\ub3d9\uc2dc\uc5d0 call\uc744 \ud558\uace0 \ub458\ub2e4 \uc751\ub2f5\uc774 \ub4e4\uc5b4\uc62c\ub54c\uae4c\uc9c0 \uae30\ub2e4\ub9b4\uc21c \uc5c6\uc744\uae4c\uc694??<br \/>\nzip()\ud568\uc218\ub97c \uc774\uc6a9\ud558\uba74 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<\/li>\n<li>\ub3d9\uc2dc \ud638\ucd9c\n<pre class=\"\">val url1 = \"https:\/\/raw.githubusercontent.com\/Charlezz\/RxJavaStudy\/master\/Sample\/first.txt\"\r\nval url2 = \"https:\/\/raw.githubusercontent.com\/Charlezz\/RxJavaStudy\/master\/Sample\/second.txt\"\r\nval src1 = Observable.just(url1).map(::get)\r\nval src2 = Observable.just(url2).map(::get)\r\nObservables.zip(src1, src2).subscribe {\r\n    println(it.first)\r\n    println(it.second)\r\n}<\/pre>\n<p>\uccab\ubc88\uc9f8 \uc751\ub2f5\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 idle\ud0c0\uc784 \uc5c6\uc774 \ub3d9\uc2dc\uc5d0 \ub124\ud2b8\uc6cc\ud06c \uc694\uccad\uc744 \ud558\ubbc0\ub85c \uc131\ub2a5\ud5a5\uc0c1\uc744 \uae30\ub300\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/li>\n<\/ul>\n<p>\uc2e4\uc81c \uc704\uc608\uc81c\ub97c \ud65c\uc6a9\ud558\uc5ec concat\uacfc zip\uc758 \uc18c\uc694\ub41c \uc2e4\ud589\uc2dc\uac04\uc758 \ucc28\uc774\ub97c \ud655\uc778\ud55c \uacb0\uacfc 950ms, 295ms\ub85c 3\ubc30 \uac00\uae4c\uc774 \uc131\ub2a5\ucc28\uc774\uac00 \ub098\ub294\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reactive Programing(1) &#8211; \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \uac1c\ub150\uc7a1\uae30 Reactive Programing(2) \u2013 Reactive Operator Reactive Programing(3) \u2013 Reactive Operator Reactive Programing(4) \u2013 Scheduler Reactive Programing(5) \u2013 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\uc758 RxJava \ud65c\uc6a9 Scheduler \uc2a4\ucf00\uc904\ub7ec \uac1c\ub150 \uc775\ud788\uae30 \uc9c0\uae08\uae4c\uc9c0\uc758 \uc608\uc81c\ub4e4\uc740 \ub300\ubd80\ubd84 MainThread\uc5d0\uc11c \ub3d9\uc791 \ud588\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ube44\ub3d9\uae30\ub85c \ub3d9\uc791\ud558\uac8c \ud558\uae30 \uc704\ud574 \ub2e4\ub978 \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc6a9\ud558\ub294\uac83\uc774 \ubc14\ub85c \uc2a4\ucf00\uc974\ub7ec\uc785\ub2c8\ub2e4. \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. [&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":[7],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/283"}],"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=283"}],"version-history":[{"count":2,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/283\/revisions"}],"predecessor-version":[{"id":1477,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/283\/revisions\/1477"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}