Submit Search
Upload
明日から使えるRxjava頻出パターン (Droid kaigi 2016)
•
40 likes
•
25,867 views
Kazuki Yoshida
Follow
Droidkaigiで紹介した資料です。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 171
Download now
Download to read offline
Recommended
.NET Core時代のCI/CD
.NET Core時代のCI/CD
Yuta Matsumura
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
aha_oretama
Everyday Life with clojure.spec
Everyday Life with clojure.spec
Kent Ohashi
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Scott Wlaschin
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
Recommended
.NET Core時代のCI/CD
.NET Core時代のCI/CD
Yuta Matsumura
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
aha_oretama
Everyday Life with clojure.spec
Everyday Life with clojure.spec
Kent Ohashi
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Scott Wlaschin
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
今さら聞けないDiとspring
今さら聞けないDiとspring
土岐 孝平
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
Takayuki Shimizukawa
Kotlinアンチパターン
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
async/await のしくみ
async/await のしくみ
信之 岩永
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
NGINX, Inc.
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
Takuya Kikuchi
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
MicroAd, Inc.(Engineer)
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
Kunihiro TANAKA
Marp Tutorial
Marp Tutorial
Rui Watanabe
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
貴仁 大和屋
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
koji lin
Wpfと非同期
Wpfと非同期
yone64
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
gvaughan
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
UiPathCommunity
More Related Content
What's hot
今さら聞けないDiとspring
今さら聞けないDiとspring
土岐 孝平
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
Takayuki Shimizukawa
Kotlinアンチパターン
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
async/await のしくみ
async/await のしくみ
信之 岩永
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
NGINX, Inc.
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
Takuya Kikuchi
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
MicroAd, Inc.(Engineer)
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
Kunihiro TANAKA
Marp Tutorial
Marp Tutorial
Rui Watanabe
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
貴仁 大和屋
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
koji lin
Wpfと非同期
Wpfと非同期
yone64
What's hot
(20)
今さら聞けないDiとspring
今さら聞けないDiとspring
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
Kotlinアンチパターン
Kotlinアンチパターン
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
オブジェクト指向できていますか?
オブジェクト指向できていますか?
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
async/await のしくみ
async/await のしくみ
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
【NGINXセミナー】 Ingressを使ってマイクロサービスの運用を楽にする方法
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
Marp Tutorial
Marp Tutorial
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
Wpfと非同期
Wpfと非同期
Recently uploaded
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
gvaughan
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
UiPathCommunity
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
Dubai Multi Commodity Centre
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
Lorenzo Miniero
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
Enterprise Knowledge
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
Fwdays
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
Mattias Andersson
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
Commit University
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
Manik S Magar
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
Alex Barbosa Coqueiro
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
BookNet Canada
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
Fwdays
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
SeasiaInfotech2
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Wonjun Hwang
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
Florian Wilhelm
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Zilliz
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Safe Software
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
BookNet Canada
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
Stephanie Beckett
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
null - The Open Security Community
Recently uploaded
(20)
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
明日から使えるRxjava頻出パターン (Droid kaigi 2016)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public interface Callback
{ void onSuccess(List<Recipe> recipes); void onError(Throwable t); } public void searchRecipe(String keyword, Callback callback) { recipeApiClient.search(keyword, callback); }
14.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
15.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
16.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
17.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
18.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); } !
19.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); } ! !
20.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); } ! ! !
21.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); } ! ! ! !
22.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
23.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
24.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
25.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); }
26.
searchRecipe(“ステーキ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { addToList(recipes); } @Override public void onError(Throwable t) { showErrorView(t); } }); } "
27.
28.
# app/build.gradle dependencies { compile
'io.reactivex:rxjava:1.1.1' compile 'io.reactivex:rxandroid:1.1.0' }
29.
public void searchRecipe(String
keyword, Callback callback) { recipeApiClient.search(keyword, callback); }
30.
public void searchRecipe(String
keyword, Callback callback) { recipeApiClient.search(keyword, callback); }
31.
public void searchRecipe(String
keyword, Callback callback) { recipeApiClient.search(keyword, callback); }
32.
public void searchRecipe(String
keyword) { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { } @Override public void onError(Throwable t) { } }); }
33.
public void searchRecipe(String
keyword) { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { } @Override public void onError(Throwable t) { } }); }
34.
public Observable<List<Recipe>> searchRecipe(String
keyword) { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { } @Override public void onError(Throwable t) { } }); }
35.
public Observable<List<Recipe>> searchRecipe(String
keyword) { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { } @Override public void onError(Throwable t) { } }); }
36.
public Observable<List<Recipe>> searchRecipe(String
keyword) { return Observable.create(subscriber -> { }); } void recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { } @Override public void onError(Throwable t) { } });
37.
public Observable<List<Recipe>> searchRecipe(String
keyword) { return Observable.create(subscriber -> { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { } @Override public void onError(Throwable t) { } }); }); } void
38.
public Observable<List<Recipe>> searchRecipe(String
keyword) { return Observable.create(subscriber -> { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { subscriber.onNext(recipes);// イベントの通知 subscriber.onCompleted(); // 全イベントが終了した通知 } @Override public void onError(Throwable t) { subscriber.onError(t); // 処理内で失敗した通知 } }); }); } void
39.
public Observable<List<Recipe>> searchRecipe(String
keyword) { return Observable.create(subscriber -> { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { subscriber.onNext(recipes);// イベントの通知 subscriber.onCompleted(); // 全イベントが終了した通知 } @Override public void onError(Throwable t) { subscriber.onError(t); // 処理内で失敗した通知 } }); }); } void
40.
public Observable<List<Recipe>> searchRecipe(String
keyword) { return Observable.create(subscriber -> { recipeApiClient.search(keyword, new Callback() { @Override public void onSuccess(List<Recipe> recipes) { subscriber.onNext(recipes);// イベントの通知 subscriber.onCompleted(); // 全イベントが終了した通知 } @Override public void onError(Throwable t) { subscriber.onError(t); // 処理内で失敗した通知 } }); }); } void
41.
public List<Recipe> searchRecipe(String
keyword) throws HttpException { // okhttpとかHttpClientで同期通信 } public Observable<List<Recipe>> searchRecipe(String keyword) { return Observable.create(subscriber -> { try{ List<Recipe> recipes = ApiClient.search(keyword); subscriber.onNext(recipes); subscriber.onFinished(); } catch(HttpException e) { subscriber.onError(e); } }
42.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); );
43.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); );
44.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); );
45.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); );
46.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); ); !
47.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); ); ! !
48.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); ); ! ! !
49.
searchRecipe(“ステーキ”) .subscribe(new Subscriber<List<Recipe>>() { @Override public
void onNext(List<Recipe> recipe) { addToList(recipes); } @Override public void onError(Throwable e) { showErrorMessage(t); } @Override public void onCompleted() { }); ); ! ! ! !
50.
searchRecipe(“ステーキ”) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); }, () -> { // 省略可能 } );
51.
searchRecipe(“ステーキ”) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); }, () -> { // 省略可能 } );
52.
searchRecipe(“ステーキ”) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); }, () -> { // 省略可能 } );
53.
searchRecipe(“ステーキ”) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); }, () -> { // 省略可能 } ); ! ! ! !
54.
🙇
55.
56.
57.
58.
59.
60.
61.
searchRecipeBy(“ステーキ”) .map(recipes -> {
/* todo something */ }) .subscribeOn(Schedulers.io()) .map(recipes -> { /* todo something */ }) .subscribe(recipes -> {});
62.
searchRecipeBy(“ステーキ”) .map(recipes -> {
/* todo something */ }) .subscribeOn(Schedulers.io()) .map(recipes -> { /* todo something */ }) .subscribe(recipes -> {});
63.
searchRecipeBy(“ステーキ”) .map(recipes -> {
/* todo something */ }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(recipes -> { /* todo something */ }) .observeOn(Schedulers.io()) .subscribe(recipes -> {});
64.
searchRecipeBy(“ステーキ”) .map(recipes -> {
/* todo something */ }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(recipes -> { /* todo something */ }) .observeOn(Schedulers.io()) .subscribe(recipes -> {});
65.
searchRecipeBy(“ステーキ”) .map(recipes -> {
/* todo something */ }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> {});
66.
searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); } );
67.
searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); } );
68.
searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); } );
69.
searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addToList(recipes); }, throwable
-> { showErrorMessage(t); } ); ! ! ! !
70.
71.
72.
searchRecipeBy(“ハンバーグ”, new Callback()
{ @Override public void onSuccess(List<Recipe> recipes) { if(getActivity() == null) { return; } addToList(recipes); } @Override public void onError(Throwable t) { if(getActivity() == null) { return; } showErrorMessage(t); } }); }
73.
# app/build.gradle dependencies { compile
'com.trello:rxlifecycle:0.4.0' compile 'com.trello:rxlifecycle-components:0.4.0' }
74.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } );
75.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } );
76.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } );
77.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } ); ! ! ! !
78.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } );
79.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } );
80.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } );
81.
searchRecipeBy(“ハンバーグ”) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(recipes -> { addList(recipes); }, throwable
-> { showErrorMessage(t); } );
82.
83.
84.
85.
# # # # ! ! !
86.
# # # # ! ! !
87.
! ! !
88.
! ! !
89.
! ! !
90.
! ! !
91.
! ! !
92.
! ! !
93.
! ! !
94.
! ! !
95.
! ! !
96.
97.
!
98.
!
99.
! !
100.
! ! !
101.
! ! !
102.
Observable.combineLatest( Observable.just(1), Observable.just(2), (i1,i2) -> i1
+ i2 // この場合、3が次のオペレーターに渡る );
103.
Observable.combineLatest( Observable.just(1), Observable.just(2), (i1,i2) -> Pair.create(i1,
i2) ); Observable.combineLatest( Observable.just(1), Observable.just(2), Pair::create );
104.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
105.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
106.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
107.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
108.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
109.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
110.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
111.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair
-> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); } );
112.
113.
114.
115.
116.
😱
117.
😱
118.
😱
119.
AdObservable(“タマゴ”) .onErrorReturn(throwable -> AdModel.EmptyData());
120.
public Observable<AdModel> searchAd(String
keyword) { return Observable.create(subscriber -> { try{ AdModel adModel = adClient.search(keyword); subscriber.onNext(adModel); } catch(HttpException e) { subscriber.onError(e); }) .onErrorReturn(e -> { return AdModel.createEmptyData(); }); }
121.
public Observable<AdModel> searchAd(String
keyword) { return Observable.create(subscriber -> { try{ AdModel adModel = adClient.search(keyword); subscriber.onNext(adModel); } catch(HttpException e) { subscriber.onError(e); }) .onErrorReturn(e -> { return AdModel.createEmptyData(); }); }
122.
public Observable<AdModel> searchAd(String
keyword) { return Observable.create(subscriber -> { try{ AdModel adModel = adClient.search(keyword); subscriber.onNext(adModel); } catch(HttpException e) { subscriber.onError(e); }) .onErrorReturn(e -> { return AdModel.createEmptyData(); }); }
123.
public Observable<AdModel> searchAd(String
keyword) { return Observable.create(subscriber -> { try{ AdModel adModel = adClient.search(keyword); subscriber.onNext(adModel); } catch(HttpException e) { subscriber.onError(e); }) .onErrorReturn(e -> { return AdModel.createEmptyData(); }); }
124.
public Observable<AdModel> searchAd(String
keyword) { return Observable.create(subscriber -> { try{ AdModel adModel = adClient.search(keyword); subscriber.onNext(adModel); } catch(HttpException e) { subscriber.onError(e); }) .onErrorReturn(e -> { return AdModel.createEmptyData(); }); }
125.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( /* 省略
*/ );
126.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( /* 省略
*/ );
127.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( /* 省略
*/ );
128.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( /* 省略
*/ );
129.
Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( /* 省略
*/ );
130.
Observable.combineLatest( searchRecipe(“ステーキ”).subscribeOn(schedulers.io()), searchAd(“ステーキ”).subscribeOn(schedulers.io()), Pair::create ) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( /* 省略
*/ );
131.
132.
AdObservable(“タマゴ”) .retry(1); // 例外が発生した場合1回だけリトライする AdObservable(“タマゴ”) .retry((count,
throwable) -> count > 2)
133.
public Observable<AdModel> searchAd(String
keyword) { return Observable.create(subscriber -> { try{ AdModel ad = AdClient.search(keyword); subscriber.onNext(ad); } catch(HttpException e) { subscriber.onError(e); }) .retry(1) .onErrorReturn(e -> { return AdModel.createEmptyData(); }); }
134.
135.
! ! !
136.
! ! ! ♥ ♥ ♥
137.
! ! ! ♥ ♥ ♥
138.
! ! ! ♥ ♥ ♥
139.
searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds
-> {})
140.
searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds
-> {})
141.
searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds
-> {})
142.
searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds
-> {})
143.
searchRecipe(“ステーキ”) .flatMap(recipes -> Observable.combineLatest( Observable.just(recipes),
// レシピリストをそのまま渡す fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得 Pair::create ) ) .map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略) .subscribe(recipes -> {})
144.
searchRecipe(“ステーキ”) .flatMap(recipes -> Observable.combineLatest( Observable.just(recipes),
// レシピリストをそのまま渡す fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得 Pair::create ) ) .map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略) .subscribe(recipes -> {})
145.
searchRecipe(“ステーキ”) .flatMap(recipes -> Observable.combineLatest( Observable.just(recipes),
// レシピリストをそのまま渡す fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得 Pair::create ) ) .map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略) .subscribe(recipes -> {})
146.
searchRecipe(“ステーキ”) .flatMap(recipes -> { fetchLikedRecipe(recipes) .map(likeIds
-> { mergeLikeState(recipes, likeIds); }); } ) .subscribe(recipes -> {})
147.
public Observable<List<Recipe>> searchRecipeWithLikeState(String
keyword) { searchRecipe(keyword) .flatMap(recipes -> Observable.combineLatest( Observable.just(recipes), fetchLikedRecipeIds(recipes)), Pair::create ) ) .map(this::mergeLikeState) } public Func1<List<Recipe>> mergeLikeState(Pair<List<Recipe>, Integer> pair) { // Like状態をレシピインスタンスに反映させる(省略) }
148.
149.
! ! ! ♥ ♥ ♥
150.
! ! ! ♥ ♥ ♥
151.
! ! ! ♥ ♥ ♥
152.
! ! ! ♥ ♥ ♥
153.
! ! ! ♥ ♥ ♥
154.
! ! ! ♥ ♥ ♥
155.
! ! ! ♥ ♥ ♥
156.
! ! ! ♥ ♥ ♥
157.
! ! ! ♥ ♥ ♥
158.
! ! ! ♥ ♥ ♥
159.
! ! ! ♥ ♥ ♥
160.
! ! ! ♥ ♥ ♥
161.
! ! ! ♥ ♥ ♥
162.
Observable.combineLatest( searchRecipeWithLikeState(“ステーキ”) .subscribeOn(schedulers.io()), searchAd(“ステーキ”) .subscribeOn(schedulers.io()), Pair::create ) .compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(pair -> { addToList(pair.first,
pair.second); }, throwable -> { showErrorMessage(t); } ); ! ! ! ♥ ♥ ♥
163.
164.
Observable.combineLatest( Observable.just(1), Observable.just(2), (i1,i2) -> i1
+ i2 );
165.
searchRecipe(“ステーキ”) .flatMap(recipes -> recipeClient.fetchLikedRecipeIds(recipes)) .subscribe(recipeIds
-> {})
166.
public class Tuple3<T1,
T2, T3> { public T1 first; public T2 second; public T3 third; public Tuple3(T1 first, T2 second, T3 third) { this.first = first; this.second = second; this.third = third; } public static <T1, T2, T3> Tuple3<T1, T2, T3> create(T1 t1, T2 t2, T3 t3) { return new Tuple3<>(t1, t2, t3); } }
167.
// in your
CustomApplication public void onCreate(Bundle saveInstanceState){ super.onCreate(); System.setProperty("rx.ring-buffer.size", "32"); }
168.
169.
Single.create(subscriber -> { subscriber.onSuccess("Hello
world"); }).subscribe(text -> { System.out.println(text); }, throwable -> { Crashlytics.logException(e); });
170.
Completable.create(subscriber -> {
subscriber.onCompleted() }).subscribe(throwable -> { Crashlytics.logException(e); }, () -> { });
171.
Download now