{"id":4259,"date":"2021-04-25T14:37:39","date_gmt":"2021-04-25T06:37:39","guid":{"rendered":"http:\/\/122.152.205.50\/wordpress\/?p=4259"},"modified":"2025-09-10T11:49:14","modified_gmt":"2025-09-10T03:49:14","slug":"rxjava","status":"publish","type":"post","link":"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259","title":{"rendered":"RxJava1.0\u7248\u672c-\u4ecb\u7ecd\u7bc7"},"content":{"rendered":"<p><a href=\"https:\/\/gank.io\/post\/560e15be2dca930e00da1083\">https:\/\/gank.io\/post\/560e15be2dca930e00da1083<\/a><br \/>\n(RxJava1.0\u7248\u672c\uff0c\u4f5c\u8005\u7531\u6d45\u5165\u6df1\u7684\u8bb2\u89e3\uff0c\u5341\u5206\u5730\u7ec6\u81f4\u3002)<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_16 counter-hierarchy counter-decimal ez-toc-grey\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" style=\"display: none;\"><i class=\"ez-toc-glyphicon ez-toc-icon-toggle\"><\/i><\/a><\/span><\/div>\n<nav><ul class=\"ez-toc-list ez-toc-list-level-1\"><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#%E4%B8%80%E3%80%81RxJava%E6%98%AF%E4%BB%80%E4%B9%88\" title=\"\u4e00\u3001RxJava\u662f\u4ec0\u4e48\">\u4e00\u3001RxJava\u662f\u4ec0\u4e48<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#%E4%BA%8C%E3%80%81RxJava_%E7%9A%84%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F\" title=\"\u4e8c\u3001RxJava \u7684\u89c2\u5bdf\u8005\u6a21\u5f0f\">\u4e8c\u3001RxJava \u7684\u89c2\u5bdf\u8005\u6a21\u5f0f<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#%E4%B8%89%E3%80%81RxJava_%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95\" title=\"\u4e09\u3001RxJava \u7684\u57fa\u672c\u7528\u6cd5\">\u4e09\u3001RxJava \u7684\u57fa\u672c\u7528\u6cd5<\/a><ul class=\"ez-toc-list-level-4\"><li class=\"ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#1_%E5%88%9B%E5%BB%BA_Observer_%EF%BC%88%E5%A4%84%E7%90%86%E4%BA%8B%E4%BB%B6%EF%BC%89\" title=\"1) \u521b\u5efa Observer \uff08\u5904\u7406\u4e8b\u4ef6\uff09\">1) \u521b\u5efa Observer \uff08\u5904\u7406\u4e8b\u4ef6\uff09<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#2_%E5%88%9B%E5%BB%BA_Observable_%EF%BC%88%E8%A7%A6%E5%8F%91%E4%BA%8B%E4%BB%B6%EF%BC%89\" title=\"2) \u521b\u5efa Observable \uff08\u89e6\u53d1\u4e8b\u4ef6\uff09\">2) \u521b\u5efa Observable \uff08\u89e6\u53d1\u4e8b\u4ef6\uff09<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-6\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#3_Subscribe_%E8%AE%A2%E9%98%85\" title=\"3) Subscribe (\u8ba2\u9605)\">3) Subscribe (\u8ba2\u9605)<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-7\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#%E6%B3%A8%E6%84%8F%E8%BF%99%E9%87%8Csubscribe%E5%92%8C%E8%A7%82%E5%AF%9F%E8%80%85%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%84%8F%E6%80%9D%E5%88%9A%E5%A5%BD%E7%9B%B8%E5%8F%8D%EF%BC%8C%E6%9C%AC%E6%9D%A5%E5%BA%94%E8%AF%A5%E6%98%AF%E8%A7%82%E5%AF%9F%E8%80%85%E8%AE%A2%E9%98%85%E8%A2%AB%E8%A7%82%E5%AF%9F%E8%80%85%EF%BC%8C%E4%BD%86%E6%98%AF%E4%BD%9C%E8%80%85%E4%B8%BA%E4%BA%86%E5%AE%9E%E7%8E%B0%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B%E7%9A%84API%E6%89%8D%E5%B0%86%E5%85%B6%E5%86%99%E5%8F%8D%E3%80%82\" title=\"\u6ce8\u610f\u8fd9\u91ccsubscribe()\u548c\u89c2\u5bdf\u8005\u8bbe\u8ba1\u6a21\u5f0f\u7684\u610f\u601d\u521a\u597d\u76f8\u53cd\uff0c\u672c\u6765\u5e94\u8be5\u662f\u201c\u89c2\u5bdf\u8005\u201d\u8ba2\u9605\u201c\u88ab\u89c2\u5bdf\u8005\u201d\uff0c\u4f46\u662f\u4f5c\u8005\u4e3a\u4e86\u5b9e\u73b0\u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684API\u624d\u5c06\u5176\u5199\u53cd\u3002\">\u6ce8\u610f\u8fd9\u91ccsubscribe()\u548c\u89c2\u5bdf\u8005\u8bbe\u8ba1\u6a21\u5f0f\u7684\u610f\u601d\u521a\u597d\u76f8\u53cd\uff0c\u672c\u6765\u5e94\u8be5\u662f\u201c\u89c2\u5bdf\u8005\u201d\u8ba2\u9605\u201c\u88ab\u89c2\u5bdf\u8005\u201d\uff0c\u4f46\u662f\u4f5c\u8005\u4e3a\u4e86\u5b9e\u73b0\u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684API\u624d\u5c06\u5176\u5199\u53cd\u3002<\/a><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-8\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#%E5%9B%9B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%8E%A7%E5%88%B6_-_Scheduler\" title=\"\u56db\u3001\u7ebf\u7a0b\u63a7\u5236 \u2014\u2014 Scheduler\">\u56db\u3001\u7ebf\u7a0b\u63a7\u5236 \u2014\u2014 Scheduler<\/a><ul class=\"ez-toc-list-level-4\"><li class=\"ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-9\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#1_Scheduler%E7%9A%84API\" title=\"1) Scheduler\u7684API\">1) Scheduler\u7684API<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-10\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#2_Scheduler%E7%9A%84%E5%8E%9F%E7%90%86\" title=\"2) Scheduler\u7684\u539f\u7406\">2) Scheduler\u7684\u539f\u7406<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-11\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#3_Scheduler%E5%8D%95%E4%B8%80%E5%AD%90%E7%BA%BF%E7%A8%8B%E5%AE%9E%E7%8E%B0\" title=\"3) Scheduler\u5355\u4e00\u5b50\u7ebf\u7a0b\u5b9e\u73b0\">3) Scheduler\u5355\u4e00\u5b50\u7ebf\u7a0b\u5b9e\u73b0<\/a><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-12\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#%E4%BA%94%E3%80%81%E5%8F%98%E6%8D%A2\" title=\"\u4e94\u3001\u53d8\u6362\">\u4e94\u3001\u53d8\u6362<\/a><ul class=\"ez-toc-list-level-4\"><li class=\"ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-13\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#1_API\" title=\"1) API\">1) API<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-4\"><a class=\"ez-toc-link ez-toc-heading-14\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4259\/#2_%E5%8E%9F%E7%90%86\" title=\"2) \u539f\u7406\">2) \u539f\u7406<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%E4%B8%80%E3%80%81RxJava%E6%98%AF%E4%BB%80%E4%B9%88\"><\/span>\u4e00\u3001RxJava\u662f\u4ec0\u4e48<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>RxJava\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a\u5f02\u6b65\u64cd\u4f5c\u5e93\uff0c\u662f\u4e00\u4e2a\u80fd\u8ba9\u4f60\u7528\u6781\u5176\u7b80\u6d01\u7684\u903b\u8f91\u53bb\u5904\u7406\u7e41\u7410\u590d\u6742\u4efb\u52a1\u7684<strong>\u5f02\u6b65<\/strong>\u4e8b\u4ef6\u5e93\u3002<\/p>\n<p>android\u5f00\u53d1\u7684\u64cd\u4f5c\u5c31\u662f\u5728\u5b50\u7ebf\u7a0b\u548c\u4e3b\u7ebf\u7a0b\u5207\u6765\u5207\u53bb\uff0c\u8fd9\u6837\u4e00\u6765\uff0c\u4f1a\u51fa\u73b0\u5f88\u591a\u7684\u5d4c\u5957\uff0c\u5bfc\u81f4\u4ee3\u7801\u4e0d\u6613\u9605\u8bfb\u548c\u7ef4\u62a4\u3002\u800cRxJava\/RxAndroid\u5b8c\u7f8e\u89e3\u51b3\u4e86\u8fd9\u4e00\u95ee\u9898\u3002<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%E4%BA%8C%E3%80%81RxJava_%E7%9A%84%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F\"><\/span>\u4e8c\u3001RxJava \u7684\u89c2\u5bdf\u8005\u6a21\u5f0f<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>RxJava\u539f\u7406\u662f\u89c2\u5bdf\u8005\u6a21\u5f0f\uff0c\u5b83\u6709\u56db\u4e2a\u91cd\u8981\u7684\u6982\u5ff5\uff1a<\/p>\n<ul>\n<li>Observable (\u53ef\u89c2\u5bdf\u8005\uff0c\u5373\u88ab\u89c2\u5bdf\u8005)<\/li>\n<li>Observer (\u89c2\u5bdf\u8005)<\/li>\n<li>subscribe (\u8ba2\u9605)<\/li>\n<li>\u4e8b\u4ef6<\/li>\n<\/ul>\n<p>\u4e0e\u4f20\u7edf\u89c2\u5bdf\u8005\u6a21\u5f0f\u4e0d\u540c\uff0c RxJava \u7684\u4e8b\u4ef6\u56de\u8c03\u65b9\u6cd5\u9664\u4e86\u666e\u901a\u4e8b\u4ef6 onNext() \uff08\u76f8\u5f53\u4e8e onClick() \/ onEvent()\uff09\u4e4b\u5916\uff0c\u8fd8\u5b9a\u4e49\u4e86\u4e24\u4e2a\u7279\u6b8a\u7684\u4e8b\u4ef6\uff1aonCompleted() \u548c onError()\u3002<\/p>\n<ul>\n<li>onCompleted(): \u4e8b\u4ef6\u961f\u5217\u5b8c\u7ed3\u3002RxJava \u4e0d\u4ec5\u628a\u6bcf\u4e2a\u4e8b\u4ef6\u5355\u72ec\u5904\u7406\uff0c\u8fd8\u4f1a\u628a\u5b83\u4eec\u770b\u505a\u4e00\u4e2a\u961f\u5217\u3002RxJava \u89c4\u5b9a\uff0c\u5f53\u4e0d\u4f1a\u518d\u6709\u65b0\u7684 onNext() \u53d1\u51fa\u65f6\uff0c\u9700\u8981\u89e6\u53d1 onCompleted() \u65b9\u6cd5\u4f5c\u4e3a\u6807\u5fd7\u3002<\/li>\n<li>onError(): \u4e8b\u4ef6\u961f\u5217\u5f02\u5e38\u3002\u5728\u4e8b\u4ef6\u5904\u7406\u8fc7\u7a0b\u4e2d\u51fa\u5f02\u5e38\u65f6\uff0conError() \u4f1a\u88ab\u89e6\u53d1\uff0c\u540c\u65f6\u961f\u5217\u81ea\u52a8\u7ec8\u6b62\uff0c\u4e0d\u5141\u8bb8\u518d\u6709\u4e8b\u4ef6\u53d1\u51fa\u3002<\/li>\n<li>\u5728\u4e00\u4e2a\u6b63\u786e\u8fd0\u884c\u7684\u4e8b\u4ef6\u5e8f\u5217\u4e2d, onCompleted() \u548c onError() \u6709\u4e14\u53ea\u6709\u4e00\u4e2a\uff0c\u5e76\u4e14\u662f\u4e8b\u4ef6\u5e8f\u5217\u4e2d\u7684\u6700\u540e\u4e00\u4e2a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0conCompleted() \u548c onError() \u4e8c\u8005\u4e5f\u662f\u4e92\u65a5\u7684\uff0c\u5373\u5728\u961f\u5217\u4e2d\u8c03\u7528\u4e86\u5176\u4e2d\u4e00\u4e2a\uff0c\u5c31\u4e0d\u5e94\u8be5\u518d\u8c03\u7528\u53e6\u4e00\u4e2a\u3002<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%E4%B8%89%E3%80%81RxJava_%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95\"><\/span>\u4e09\u3001RxJava \u7684\u57fa\u672c\u7528\u6cd5<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"1_%E5%88%9B%E5%BB%BA_Observer_%EF%BC%88%E5%A4%84%E7%90%86%E4%BA%8B%E4%BB%B6%EF%BC%89\"><\/span>1) \u521b\u5efa Observer \uff08\u5904\u7406\u4e8b\u4ef6\uff09<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Observer \u5373\u89c2\u5bdf\u8005\uff0c\u5b83\u51b3\u5b9a\u4e8b\u4ef6\u89e6\u53d1\u7684\u65f6\u5019\u5c06\u6709\u600e\u6837\u7684\u884c\u4e3a\u3002\u521b\u5efa\u89c2\u5bdf\u8005\u53ef\u4ee5\u5b9e\u73b0\u63a5\u53e3Observer\u6216\u8005\u7ee7\u627f\u62bd\u8c61\u7c7bSubscriber\u3002<\/p>\n<p>Subscriber\u5728Observer\u4e4b\u4e0a\u6269\u5c55\u4e862\u4e2a\u65b9\u6cd5\uff1a<\/p>\n<ul>\n<li>onStart(): \u5b83\u4f1a\u5728 subscribe \u521a\u5f00\u59cb\uff0c\u800c\u4e8b\u4ef6\u8fd8\u672a\u53d1\u9001\u4e4b\u524d\u88ab\u8c03\u7528\uff0c\u53ef\u4ee5\u7528\u4e8e\u505a\u4e00\u4e9b\u51c6\u5907\u5de5\u4f5c\uff0c\u4f8b\u5982\u6570\u636e\u7684\u6e05\u96f6\u6216\u91cd\u7f6e\u3002\u5b83\u603b\u662f\u5728 subscribe \u6240\u53d1\u751f\u7684\u7ebf\u7a0b\u88ab\u8c03\u7528\uff0c\u800c\u4e0d\u80fd\u6307\u5b9a\u7ebf\u7a0b\u3002<\/li>\n<li>unsubscribe():\u53d6\u6d88\u8ba2\u9605\uff0c \u79fb\u9664Observable\u6301\u6709Subscriber\u7684\u5f15\u7528\uff0c\u51cf\u5c0f\u5185\u5b58\u6cc4\u9732\u7684\u98ce\u9669\u3002<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"2_%E5%88%9B%E5%BB%BA_Observable_%EF%BC%88%E8%A7%A6%E5%8F%91%E4%BA%8B%E4%BB%B6%EF%BC%89\"><\/span>2) \u521b\u5efa Observable \uff08\u89e6\u53d1\u4e8b\u4ef6\uff09<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Observable \u5373\u88ab\u89c2\u5bdf\u8005\uff0c\u5b83\u51b3\u5b9a\u4ec0\u4e48\u65f6\u5019\u89e6\u53d1\u4e8b\u4ef6\u4ee5\u53ca\u89e6\u53d1\u600e\u6837\u7684\u4e8b\u4ef6\u3002<br \/>\n\u53ef\u4ee5\u901a\u8fc7<code>Observable.create()\u3001Observable.just()\u3001Observable.from()<\/code>\u7b49\u65b9\u6cd5\u521b\u5efaObservable\u5bf9\u8c61\u3002\u67e5\u770b\u6e90\u7801\u53ef\u4ee5\u77e5\u9053just\u8c03\u7528from\uff0cfrom\u8c03\u7528create\u65b9\u6cd5\u3002<\/p>\n<pre><code class=\"language-java\">Observable observable = Observable.create(new Observable.OnSubscribe&lt;String&gt;() {\n    @Override\n    public void call(Subscriber&lt;? super String&gt; subscriber) {\n        subscriber.onNext(&quot;Hello&quot;);\n        subscriber.onNext(&quot;Hi&quot;);\n        subscriber.onNext(&quot;Aloha&quot;);\n        subscriber.onCompleted();\n    }\n});<\/code><\/pre>\n<p>\u6ce8\u610f\u4e0a\u9762\u7684\u8c03\u7528\u987a\u5e8f\uff1aObservable\u4f20\u5165\u4e86\u4e00\u4e2aOnSubscribe\u5185\u90e8\u7c7b\uff0c\u5b83\u7684call\u65b9\u6cd5\u88ab\u8c03\u7528\uff08<code>observable.subscribe<\/code>\u65b9\u6cd5\u4f1a\u8c03\u7528call\uff09\uff0c\u7136\u540ecall\u65b9\u6cd5\u53c8\u4f1a\u8c03\u7528subscriber\u7684\u65b9\u6cd5\u3002\u8fd9\u6837\u5c31\u5f62\u6210\u4e00\u6761\u5b8c\u6574\u7684\u56de\u8c03\u94fe\u8def\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff1a<br \/>\n<img src=\"http:\/\/xinyiworld.top\/wordpress\/wp-content\/custom_pictures\/20210509162643.jpg\" alt=\"\" \/><\/p>\n<h4><span class=\"ez-toc-section\" id=\"3_Subscribe_%E8%AE%A2%E9%98%85\"><\/span>3) Subscribe (\u8ba2\u9605)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<pre><code class=\"language-java\">Subscription subscription = observable.subscribe(observer);\n\/\/ \u6216\u8005\uff1a\nSubscription subscription = observable.subscribe(subscriber);<\/code><\/pre>\n<p>\u8ba2\u9605\u540e\u8fd4\u56deSubscription\u5bf9\u8c61<\/p>\n<blockquote>\n<h4><span class=\"ez-toc-section\" id=\"%E6%B3%A8%E6%84%8F%E8%BF%99%E9%87%8Csubscribe%E5%92%8C%E8%A7%82%E5%AF%9F%E8%80%85%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%84%8F%E6%80%9D%E5%88%9A%E5%A5%BD%E7%9B%B8%E5%8F%8D%EF%BC%8C%E6%9C%AC%E6%9D%A5%E5%BA%94%E8%AF%A5%E6%98%AF%E8%A7%82%E5%AF%9F%E8%80%85%E8%AE%A2%E9%98%85%E8%A2%AB%E8%A7%82%E5%AF%9F%E8%80%85%EF%BC%8C%E4%BD%86%E6%98%AF%E4%BD%9C%E8%80%85%E4%B8%BA%E4%BA%86%E5%AE%9E%E7%8E%B0%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B%E7%9A%84API%E6%89%8D%E5%B0%86%E5%85%B6%E5%86%99%E5%8F%8D%E3%80%82\"><\/span>\u6ce8\u610f\u8fd9\u91ccsubscribe()\u548c\u89c2\u5bdf\u8005\u8bbe\u8ba1\u6a21\u5f0f\u7684\u610f\u601d\u521a\u597d\u76f8\u53cd\uff0c\u672c\u6765\u5e94\u8be5\u662f\u201c\u89c2\u5bdf\u8005\u201d\u8ba2\u9605\u201c\u88ab\u89c2\u5bdf\u8005\u201d\uff0c\u4f46\u662f\u4f5c\u8005\u4e3a\u4e86\u5b9e\u73b0\u54cd\u5e94\u5f0f\u7f16\u7a0b\u7684API\u624d\u5c06\u5176\u5199\u53cd\u3002<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<\/blockquote>\n<ul>\n<li>\n<p>\u8ba2\u9605\u65b9\u6cd5<code>observable.subscribe(observer)<\/code>\u7684\u6e90\u7801\uff1a<\/p>\n<pre><code class=\"language-java\">public final Subscription subscribe(final Observer&lt;? super T&gt; observer) {\n    if (observer instanceof Subscriber) {\n        return subscribe((Subscriber&lt;? super T&gt;)observer);\n    }\n    return subscribe(new Subscriber&lt;T&gt;() {\n\n        @Override\n        public void onCompleted() {\n            observer.onCompleted();\n        }\n\n        @Override\n        public void onError(Throwable e) {\n            observer.onError(e);\n        }\n\n        @Override\n        public void onNext(T t) {\n            observer.onNext(t);\n        }\n\n    });\n}<\/code><\/pre>\n<\/li>\n<\/ul>\n<p>\u53ef\u4ee5\u770b\u5230<code>observable.subscribe<\/code>\u5185\u90e8\u90fd\u662f\u8ba2\u9605Subscriber\uff0c\u53ea\u4e0d\u8fc7\u5982\u679c\u88ab\u8ba2\u9605\u7684\u662fObserver\u63a5\u53e3\uff0c\u53ea\u4f1a\u56de\u8c03\u5176<code>onCompleted\u3001onError\u3001onNext<\/code>\u65b9\u6cd5\u3002<\/p>\n<p>\u540c\u65f6subscribe() \u8fd8\u652f\u6301\u4e0d\u5b8c\u6574\u5b9a\u4e49\u7684\u56de\u8c03subscribe(Action1 ...)\uff0c\u53ef\u4ee5\u907f\u514d\u7ed9\u7528\u6237\u4e0d\u5fc5\u8981\u7684\u56de\u8c03\u3002<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%E5%9B%9B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%8E%A7%E5%88%B6_-_Scheduler\"><\/span>\u56db\u3001\u7ebf\u7a0b\u63a7\u5236 \u2014\u2014 Scheduler<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"1_Scheduler%E7%9A%84API\"><\/span>1) Scheduler\u7684API<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><code>subscribeOn()<\/code>\uff1a\u6307\u5b9a\u4e8b\u4ef6\u4ea7\u751f\u7684\u7ebf\u7a0b<br \/>\n<code>observeOn()<\/code>\uff1a\u6307\u5b9a\u4e8b\u4ef6\u6d88\u8d39\u7684\u7ebf\u7a0b<\/p>\n<h4><span class=\"ez-toc-section\" id=\"2_Scheduler%E7%9A%84%E5%8E%9F%E7%90%86\"><\/span>2) Scheduler\u7684\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u7275\u6d89\u5230\u540e\u9762\u7684\u77e5\u8bc6\uff0clift()\u539f\u7406\u3002<\/p>\n<h4><span class=\"ez-toc-section\" id=\"3_Scheduler%E5%8D%95%E4%B8%80%E5%AD%90%E7%BA%BF%E7%A8%8B%E5%AE%9E%E7%8E%B0\"><\/span>3) Scheduler\u5355\u4e00\u5b50\u7ebf\u7a0b\u5b9e\u73b0<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>1\uff09\u65b9\u6cd51\uff1a\u4f7f\u7528 Schedulers.single()<\/p>\n<pre><code>val singleScheduler = Schedulers.single()\n\n\/\/ \u7b2c\u4e00\u6b21\u64cd\u4f5c\nObservable.just(&quot;&quot;)\n    .subscribeOn(singleScheduler)\n    .map {\n        if (CheckInstanceManager.isWorkingNow()) {\n            CheckInstanceManager.interruptCurCheckInstance()\n        }\n        UltraSoundSDK.terminate()\n        UltraSoundSDK.initialize()\n    }\n    .observeOn(AndroidSchedulers.mainThread())\n    .subscribe {\n        lockCheckButton = false\n        checkLocalCheckState()\n    }\n\n\/\/ \u7b2c\u4e8c\u6b21\u64cd\u4f5c\uff08\u4f1a\u5728\u7b2c\u4e00\u6b21\u5b8c\u6210\u540e\u6267\u884c\uff09\nObservable.just(&quot;&quot;)\n    .subscribeOn(singleScheduler)\n    .map {\n        if (CheckInstanceManager.isWorkingNow()) {\n            CheckInstanceManager.interruptCurCheckInstance()\n        }\n        UltraSoundSDK.terminate()\n        UltraSoundSDK.initialize()\n    }\n    .observeOn(AndroidSchedulers.mainThread())\n    .subscribe {\n        lockCheckButton = false\n        checkLocalCheckState()\n    }<\/code><\/pre>\n<p>2\uff09\u65b9\u6cd52\uff1a\u4f7f\u7528\u4e32\u884c\u5316\u8c03\u5ea6\u5668<\/p>\n<pre><code>val serialScheduler = Schedulers.io().createWorker().scheduler\n\n\/\/ \u7136\u540e\u4f7f\u7528\u8fd9\u4e2a\u4e32\u884c\u5316\u8c03\u5ea6\u5668\nObservable.just(&quot;&quot;)\n    .subscribeOn(serialScheduler)\n    \/\/ ... \u5176\u4f59\u4ee3\u7801\u76f8\u540c<\/code><\/pre>\n<p>3\uff09\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u5355\u7ebf\u7a0b\u6267\u884c\u5668<\/p>\n<pre><code>val singleThreadExecutor = Executors.newSingleThreadExecutor()\nval singleThreadScheduler = Schedulers.from(singleThreadExecutor)\n\n\/\/ \u7136\u540e\u4f7f\u7528\u8fd9\u4e2a\u8c03\u5ea6\u5668\nObservable.just(&quot;&quot;)\n    .subscribeOn(singleThreadScheduler)\n    \/\/ ... \u5176\u4f59\u4ee3\u7801\u76f8\u540c<\/code><\/pre>\n<h3><span class=\"ez-toc-section\" id=\"%E4%BA%94%E3%80%81%E5%8F%98%E6%8D%A2\"><\/span>\u4e94\u3001\u53d8\u6362<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><strong>\u6240\u8c13\u53d8\u6362\uff0c\u5c31\u662f\u5c06\u4e8b\u4ef6\u5e8f\u5217\u4e2d\u7684\u5bf9\u8c61\u6216\u6574\u4e2a\u5e8f\u5217\u8fdb\u884c\u52a0\u5de5\u5904\u7406\uff0c\u8f6c\u6362\u6210\u4e0d\u540c\u7684\u4e8b\u4ef6\u6216\u4e8b\u4ef6\u5e8f\u5217\u3002<\/strong><\/p>\n<h4><span class=\"ez-toc-section\" id=\"1_API\"><\/span>1) API<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>map\n<pre><code class=\"language-java\">Observable.just(&quot;images\/logo.png&quot;) \/\/ \u8f93\u5165\u7c7b\u578b String\n.map(new Func1&lt;String, Bitmap&gt;() {\n    @Override\n    public Bitmap call(String filePath) { \/\/ \u53c2\u6570\u7c7b\u578b String\n        return getBitmapFromPath(filePath); \/\/ \u8fd4\u56de\u7c7b\u578b Bitmap\n    }\n})\n.subscribe(new Action1&lt;Bitmap&gt;() {\n    @Override\n    public void call(Bitmap bitmap) { \/\/ \u53c2\u6570\u7c7b\u578b Bitmap\n        showBitmap(bitmap);\n    }\n});<\/code><\/pre>\n<\/li>\n<li>flatMap\n<pre><code class=\"language-java\">Student[] students = ...;\nSubscriber&lt;Course&gt; subscriber = new Subscriber&lt;Course&gt;() {\n@Override\npublic void onNext(Course course) {\n    Log.d(tag, course.getName());\n}\n...\n};\nObservable.from(students)\n.flatMap(new Func1&lt;Student, Observable&lt;Course&gt;&gt;() {\n    @Override\n    public Observable&lt;Course&gt; call(Student student) {\n        return Observable.from(student.getCourses());\n    }\n})\n.subscribe(subscriber);<\/code><\/pre>\n<p>flatMap() \u548c map() \u6709\u4e00\u4e2a\u76f8\u540c\u70b9\uff1a\u5b83\u4e5f\u662f\u628a\u4f20\u5165\u7684\u53c2\u6570\u8f6c\u5316\u4e4b\u540e\u8fd4\u56de\u53e6\u4e00\u4e2a\u5bf9\u8c61\u3002\u4f46\u9700\u8981\u6ce8\u610f\uff0c\u548c map() \u4e0d\u540c\u7684\u662f\uff0c flatMap() \u4e2d\u8fd4\u56de\u7684\u662f\u4e2a Observable \u5bf9\u8c61\uff0c\u5e76\u4e14\u8fd9\u4e2a Observable \u5bf9\u8c61\u5e76\u4e0d\u662f\u88ab\u76f4\u63a5\u53d1\u9001\u5230\u4e86 Subscriber \u7684\u56de\u8c03\u65b9\u6cd5\u4e2d\u3002<\/p>\n<\/li>\n<\/ul>\n<p><strong>flatMap() \u5e38\u7528\u4e8e\u5d4c\u5957\u7684\u5f02\u6b65\u64cd\u4f5c<\/strong><\/p>\n<pre><code class=\"language-java\">networkClient.token() \/\/ \u8fd4\u56de Observable&lt;String&gt;\uff0c\u5728\u8ba2\u9605\u65f6\u8bf7\u6c42 token\uff0c\u5e76\u5728\u54cd\u5e94\u540e\u53d1\u9001 token\n    .flatMap(new Func1&lt;String, Observable&lt;Messages&gt;&gt;() {\n        @Override\n        public Observable&lt;Messages&gt; call(String token) {\n            \/\/ \u8fd4\u56de Observable&lt;Messages&gt;\uff0c\u5728\u8ba2\u9605\u65f6\u8bf7\u6c42\u6d88\u606f\u5217\u8868\uff0c\u5e76\u5728\u54cd\u5e94\u540e\u53d1\u9001\u8bf7\u6c42\u5230\u7684\u6d88\u606f\u5217\u8868\n            return networkClient.messages();\n        }\n    })\n    .subscribe(new Action1&lt;Messages&gt;() {\n        @Override\n        public void call(Messages messages) {\n            \/\/ \u5904\u7406\u663e\u793a\u6d88\u606f\u5217\u8868\n            showMessages(messages);\n        }\n    });<\/code><\/pre>\n<ul>\n<li>\n<p>throttleFirst<br \/>\n\u9632\u6296\u52a8<\/p>\n<\/li>\n<li>\n<p>compose<br \/>\n\u9632\u6296\u52a8<\/p>\n<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"2_%E5%8E%9F%E7%90%86\"><\/span>2) \u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u53d8\u6362\u867d\u7136\u529f\u80fd\u5404\u6709\u4e0d\u540c\uff0c\u4f46\u5b9e\u8d28\u4e0a\u90fd\u662f\u9488\u5bf9\u4e8b\u4ef6\u5e8f\u5217\u7684\u5904\u7406\u548c\u518d\u53d1\u9001\u3002\u800c\u5728 RxJava \u7684\u5185\u90e8\uff0c\u5b83\u4eec\u662f\u57fa\u4e8e\u540c\u4e00\u4e2a\u57fa\u7840\u7684\u53d8\u6362\u65b9\u6cd5\uff1a lift(Operator)\u3002<\/p>\n<p><strong>\u5728 Observable \u6267\u884c\u4e86 lift(Operator) \u65b9\u6cd5\u4e4b\u540e\uff0c\u4f1a\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684 Observable\uff0c\u8fd9\u4e2a\u65b0\u7684 Observable \u4f1a\u50cf\u4e00\u4e2a\u4ee3\u7406\u4e00\u6837\uff0c\u8d1f\u8d23\u63a5\u6536\u539f\u59cb\u7684 Observable \u53d1\u51fa\u7684\u4e8b\u4ef6\uff0c\u5e76\u5728\u5904\u7406\u540e\u53d1\u9001\u7ed9 Subscriber\u3002<\/strong><\/p>\n<p>\u4ee5<code>map<\/code>\u53d8\u6362\u4e3a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-java\">    public final &lt;R&gt; Observable&lt;R&gt; map(Func1&lt;? super T, ? extends R&gt; func) {\n        return lift(new OperatorMap&lt;T, R&gt;(func));\n    }<\/code><\/pre>\n<pre><code class=\"language-java\">public final class OperatorMap&lt;T, R&gt; implements Operator&lt;R, T&gt; {\n\n    private final Func1&lt;? super T, ? extends R&gt; transformer;\n\n    public OperatorMap(Func1&lt;? super T, ? extends R&gt; transformer) {\n        this.transformer = transformer;\n    }\n\n    @Override\n    public Subscriber&lt;? super T&gt; call(final Subscriber&lt;? super R&gt; o) {\n        return new Subscriber&lt;T&gt;(o) {\n\n            @Override\n            public void onCompleted() {\n                o.onCompleted();\n            }\n\n            @Override\n            public void onError(Throwable e) {\n                o.onError(e);\n            }\n\n            @Override\n            public void onNext(T t) {\n                try {\n                    o.onNext(transformer.call(t));\n                } catch (Throwable e) {\n                    Exceptions.throwIfFatal(e);\n                    onError(OnErrorThrowable.addValueAsLastCause(e, t));\n                }\n            }\n\n        };\n    }\n\n}\n<\/code><\/pre>\n<pre><code class=\"language-java\">public final &lt;R&gt; Observable&lt;R&gt; lift(final Operator&lt;? extends R, ? super T&gt; operator) {\n        return new Observable&lt;R&gt;(new OnSubscribe&lt;R&gt;() {\n            @Override\n            public void call(Subscriber&lt;? super R&gt; o) {\n                try {\n                    Subscriber&lt;? super T&gt; st = hook.onLift(operator).call(o);\n                    try {\n                        \/\/ new Subscriber created and being subscribed with so &#039;onStart&#039; it\n                        st.onStart();\n\n                        \/\/\u8fd9\u91cc\u7684onSubscribe\u4e3a\u4ec0\u4e48\u662f\u65e7\u7684Observable\u7684\u53d8\u91cf\uff1f\u4e3a\u4ec0\u4e48\u4e0d\u662f\u5f53\u524d\u7c7b\uff1f\n                        onSubscribe.call(st);\n                    } catch (Throwable e) {\n                        \/\/ localized capture of errors rather than it skipping all operators \n                        \/\/ and ending up in the try\/catch of the subscribe method which then\n                        \/\/ prevents onErrorResumeNext and other similar approaches to error handling\n                        if (e instanceof OnErrorNotImplementedException) {\n                            throw (OnErrorNotImplementedException) e;\n                        }\n                        st.onError(e);\n                    }\n                } catch (Throwable e) {\n                    if (e instanceof OnErrorNotImplementedException) {\n                        throw (OnErrorNotImplementedException) e;\n                    }\n                    \/\/ if the lift function failed all we can do is pass the error to the final Subscriber\n                    \/\/ as we don&#039;t have the operator available to us\n                    o.onError(e);\n                }\n            }\n        });\n    }<\/code><\/pre>\n<button class=\"simplefavorite-button\" data-postid=\"4259\" data-siteid=\"1\" data-groupid=\"1\" data-favoritecount=\"0\" style=\"\">\u6536\u85cf <i class=\"sf-icon-star-empty\"><\/i><\/button>","protected":false},"excerpt":{"rendered":"<p>https:\/\/gank.io\/post\/560e15be2dca930e00da1083 (RxJ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[165],"tags":[],"_links":{"self":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4259"}],"collection":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4259"}],"version-history":[{"count":15,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4259\/revisions"}],"predecessor-version":[{"id":15938,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4259\/revisions\/15938"}],"wp:attachment":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4259"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}