{"id":397,"date":"2023-02-25T08:52:44","date_gmt":"2023-02-25T00:52:44","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=397"},"modified":"2023-04-29T21:38:39","modified_gmt":"2023-04-29T13:38:39","slug":"rxjava2-learning-9-merging-local-and-network-data-in-shopping-carts","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/25\/rxjava2-learning-9-merging-local-and-network-data-in-shopping-carts\/","title":{"rendered":"RxJava2\u5b66\u4e60\u4e4b\u4e5d\uff1a\u8d2d\u7269\u8f66\u5408\u5e76\u672c\u5730\u548c\u7f51\u7edc\u6570\u636e"},"content":{"rendered":"<h3>RxJava\u64cd\u4f5c\u7b26<\/h3>\n<p>\u672c\u4f8b\u6d89\u53ca\u7684RxJava\u64cd\u4f5c\u7b26\uff1a<\/p>\n<ul>\n<li><strong>Merge<\/strong> \u2014 <em>\u5c06\u4e24\u4e2aObservable\u53d1\u5c04\u7684\u6570\u636e\u7ec4\u5408\u5e76\u6210\u4e00\u4e2a<\/em><\/li>\n<\/ul>\n<p><!-- more --><\/p>\n<p>\u7ed3\u5408\u4f7f\u7528 Retrofit\u8f6c\u6362\u5668 GsonConverterFactory \u548c\u5176 RxJava\u9002\u914d\u5668 RxJavaCallAdapterFactory<\/p>\n<h3>RxJava\u5b9e\u73b0<\/h3>\n<h4>\u6dfb\u52a0\u4f9d\u8d56<\/h4>\n<pre><code>compile &#039;com.squareup.retrofit2:retrofit:2.1.0&#039;\ncompile &#039;com.squareup.retrofit2:converter-gson:2.1.0&#039;\ncompile &#039;com.squareup.retrofit2:adapter-rxjava:2.1.0&#039;<\/code><\/pre>\n<h4>\u4e1a\u52a1\u8bf7\u6c42\u63a5\u53e3<\/h4>\n<pre><code class=\"language-java\">public interface Api {\n\n    @GET(&quot;courses&quot;)\n    Observable&lt;List&lt;Course&gt;&gt; getCourses();\n\n}<\/code><\/pre>\n<h4>RxJava\u5b9e\u73b0<\/h4>\n<pre><code class=\"language-java\">public void merge(View view) {\n    Retrofit retrofit = new Retrofit.Builder()\n        .baseUrl(SERVER_ADDRESS)\n        .addConverterFactory(GsonConverterFactory.create())\n        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())\n        .build();\n\n    api = retrofit.create(Api.class);\n\n    \/\/Merge\u5408\u5e76\u64cd\u4f5c\u7b26\n    Observable.merge(getDatasFromLocal(), getDatasFromNetWork())\n        .subscribe(new Subscriber&lt;List&lt;Course&gt;&gt;() {\n            @Override\n            public void onCompleted() {\n                Log.i(TAG, &quot;onCompleted: &quot;);\n            }\n\n            @Override\n            public void onError(Throwable e) {\n                e.printStackTrace();\n            }\n\n            @Override\n            public void onNext(List&lt;Course&gt; courses) {\n                for (Course cource : courses){\n                    Log.i(TAG, &quot;onNext: &quot; + cource.getName());\n                }\n            }\n        });\n}\n\nprivate Observable&lt;List&lt;Course&gt;&gt; getDatasFromLocal(){\n    List&lt;Course&gt; list = new ArrayList&lt;&gt;();\n    list.add(new Course(&quot;\u6570\u5b66&quot;));\n    list.add(new Course(&quot;\u8bed\u6587&quot;));\n    return Observable.just(list);\n}\n\nprivate Observable&lt;List&lt;Course&gt;&gt; getDatasFromNetWork(){\n    return api.getCourses().subscribeOn(Schedulers.io());\n}<\/code><\/pre>\n<h4>Python Flask\u670d\u52a1\u7aef\u8bbe\u8ba1<\/h4>\n<pre><code class=\"language-python\">@app.route(&quot;\/courses&quot;)\ndef courses():\n    course1 = Cource(id=&quot;1&quot;, name=&quot;\u7269\u7406&quot;)\n    course2 = Cource(id=&quot;2&quot;, name=&quot;\u5316\u5b66&quot;)\n\n    courses = {course1, course2}\n    json = jsonpickle.encode(courses, unpicklable=False)\n\n    return json\n\nclass Cource():\n    def __init__(self, id, name):\n        self.id = id\n        self.name = name<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>RxJava\u64cd\u4f5c\u7b26 \u672c\u4f8b\u6d89\u53ca\u7684RxJava\u64cd\u4f5c\u7b26\uff1a Merge \u2014 \u5c06\u4e24\u4e2aObservable\u53d1\u5c04\u7684\u6570\u636e\u7ec4\u5408\u5e76 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[131],"tags":[132],"class_list":["post-397","post","type-post","status-publish","format-standard","hentry","category-rxjava","tag-rxjava"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/397","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=397"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/397\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}