明日から使えるrxjava頻出パターン (droid kaigi 2016)

171

Upload: kazuki-yoshida

Post on 16-Apr-2017

16.642 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 3: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 4: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 5: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 6: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 7: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 8: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 9: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 10: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 11: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 12: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 13: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public interface Callback { void onSuccess(List<Recipe> recipes); void onError(Throwable t);}

public void searchRecipe(String keyword, Callback callback) { recipeApiClient.search(keyword, callback); }

Page 14: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 15: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 16: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 17: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 18: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

!

Page 19: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

!

!

Page 20: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

!

!

!

Page 21: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

!

!

!

!

Page 22: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 23: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 24: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 25: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

Page 26: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { addToList(recipes);}@Overridepublic void onError(Throwable t) { showErrorView(t);}

}); }

"

Page 27: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 28: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

# app/build.gradle dependencies { compile 'io.reactivex:rxjava:1.1.1' compile 'io.reactivex:rxandroid:1.1.0'}

Page 29: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public void searchRecipe(String keyword, Callback callback) { recipeApiClient.search(keyword, callback);}

Page 30: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public void searchRecipe(String keyword, Callback callback) { recipeApiClient.search(keyword, callback);}

Page 31: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public void searchRecipe(String keyword, Callback callback) { recipeApiClient.search(keyword, callback);}

Page 32: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public void searchRecipe(String keyword) { recipeApiClient.search(keyword, new Callback() {

@Overridepublic void onSuccess(List<Recipe> recipes) {}@Overridepublic void onError(Throwable t) {}

}); }

Page 33: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public void searchRecipe(String keyword) { recipeApiClient.search(keyword, new Callback() {

@Overridepublic void onSuccess(List<Recipe> recipes) {}@Overridepublic void onError(Throwable t) {}

}); }

Page 34: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public Observable<List<Recipe>> searchRecipe(String keyword) { recipeApiClient.search(keyword, new Callback() {

@Overridepublic void onSuccess(List<Recipe> recipes) {

}@Overridepublic void onError(Throwable t) {

} }); }

Page 35: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

public Observable<List<Recipe>> searchRecipe(String keyword) { recipeApiClient.search(keyword, new Callback() {

@Overridepublic void onSuccess(List<Recipe> recipes) {

}@Overridepublic void onError(Throwable t) {

} }); }

Page 36: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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) {

}});

Page 37: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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

Page 38: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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

Page 39: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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

Page 40: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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

Page 41: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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); }

}

Page 42: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

Page 43: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

Page 44: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

Page 45: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

Page 46: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

!

Page 47: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

!

!

Page 48: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

!

!

!

Page 49: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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() { }););

!

!

!

!

Page 50: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); }, () -> { // 省略可能 } );

Page 51: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); }, () -> { // 省略可能 } );

Page 52: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); }, () -> { // 省略可能 } );

Page 53: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); }, () -> { // 省略可能 } );

!

!

!

!

Page 54: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

🙇

Page 55: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 56: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 57: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 58: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 59: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 60: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 61: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ステーキ”) .map(recipes -> { /* todo something */ }) .subscribeOn(Schedulers.io()) .map(recipes -> { /* todo something */ }).subscribe(recipes -> {});

Page 62: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ステーキ”) .map(recipes -> { /* todo something */ }) .subscribeOn(Schedulers.io()) .map(recipes -> { /* todo something */ }).subscribe(recipes -> {});

Page 63: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ステーキ”) .map(recipes -> { /* todo something */ }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(recipes -> { /* todo something */ }).observeOn(Schedulers.io()).subscribe(recipes -> {});

Page 64: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ステーキ”) .map(recipes -> { /* todo something */ }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).map(recipes -> { /* todo something */ }).observeOn(Schedulers.io()).subscribe(recipes -> {});

Page 65: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ステーキ”) .map(recipes -> { /* todo something */ }) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> {});

Page 66: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); });

Page 67: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); });

Page 68: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); });

Page 69: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addToList(recipes); }, throwable -> { showErrorMessage(t); });

!

!

!

!

Page 70: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 71: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 72: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”, new Callback() {@Overridepublic void onSuccess(List<Recipe> recipes) { if(getActivity() == null) { return; } addToList(recipes);}@Overridepublic void onError(Throwable t) { if(getActivity() == null) { return; } showErrorMessage(t);}

}); }

Page 73: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

# app/build.gradle dependencies { compile 'com.trello:rxlifecycle:0.4.0' compile 'com.trello:rxlifecycle-components:0.4.0'}

Page 74: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

Page 75: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

Page 76: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

Page 77: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

!

!

!

!

Page 78: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

Page 79: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

Page 80: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

Page 81: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipeBy(“ハンバーグ”).compose(bindToLifecycle()) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(recipes -> { addList(recipes); }, throwable -> { showErrorMessage(t); });

Page 82: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 83: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 84: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 85: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

#

#

#

#

!

!

!

Page 86: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

#

#

#

#

!

!

!

Page 87: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 88: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 89: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 90: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 91: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 92: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 93: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 94: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 95: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 96: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 97: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

Page 98: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

Page 99: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

Page 100: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 101: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 102: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( Observable.just(1), Observable.just(2), (i1,i2) -> i1 + i2 // この場合、3が次のオペレーターに渡る);

Page 103: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( Observable.just(1), Observable.just(2), (i1,i2) -> Pair.create(i1, i2) );

Observable.combineLatest( Observable.just(1), Observable.just(2), Pair::create );

Page 104: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 105: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 106: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 107: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 108: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 109: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 110: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 111: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), // 広告情報を取得するメソッドだと思って下さい Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(pair -> { addToListWithBannerIfExist(pair.first, pair.second); }, throwable -> { showErrorMessage(t); });

Page 112: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 113: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 114: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 115: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 116: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

😱

Page 117: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

😱

Page 118: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

😱

Page 119: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

AdObservable(“タマゴ”) .onErrorReturn(throwable -> AdModel.EmptyData());

Page 120: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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(); });

}

Page 121: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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(); });

}

Page 122: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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(); });

}

Page 123: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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(); });

}

Page 124: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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(); });

}

Page 125: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe( /* 省略 */ );

Page 126: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe( /* 省略 */ );

Page 127: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe( /* 省略 */ );

Page 128: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe( /* 省略 */ );

Page 129: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”), searchAd(“ステーキ”), Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe( /* 省略 */ );

Page 130: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( searchRecipe(“ステーキ”).subscribeOn(schedulers.io()), searchAd(“ステーキ”).subscribeOn(schedulers.io()), Pair::create) .subscribeOn(schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe( /* 省略 */ );

Page 131: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 132: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

AdObservable(“タマゴ”) .retry(1); // 例外が発生した場合1回だけリトライする

AdObservable(“タマゴ”) .retry((count, throwable) -> count > 2)

Page 133: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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(); });

}

Page 134: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 135: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 136: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 137: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 138: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 139: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds -> {})

Page 140: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds -> {})

Page 141: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds -> {})

Page 142: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> fetchLikedRecipeIds(recipes)) .subscribe(recipeIds -> {})

Page 143: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> Observable.combineLatest( Observable.just(recipes), // レシピリストをそのまま渡す fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得 Pair::create ) ) .map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略) .subscribe(recipes -> {})

Page 144: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> Observable.combineLatest( Observable.just(recipes), // レシピリストをそのまま渡す fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得 Pair::create ) ) .map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略) .subscribe(recipes -> {})

Page 145: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> Observable.combineLatest( Observable.just(recipes), // レシピリストをそのまま渡す fetchLikedRecipe(recipes)), //レシピリストからLikeしたレシピIdを取得 Pair::create ) ) .map(this::mergeLikeState) // mapでLike状態をレシピインスタンスに反映させる(省略) .subscribe(recipes -> {})

Page 146: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> { fetchLikedRecipe(recipes) .map(likeIds -> { mergeLikeState(recipes, likeIds); }); } ) .subscribe(recipes -> {})

Page 147: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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状態をレシピインスタンスに反映させる(省略) }

Page 148: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 149: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 150: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 151: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 152: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 153: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 154: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 155: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 156: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 157: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 158: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 159: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 160: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 161: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

!

!

!

Page 162: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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); });

!

!

!

Page 163: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 164: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Observable.combineLatest( Observable.just(1), Observable.just(2), (i1,i2) -> i1 + i2 );

Page 165: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

searchRecipe(“ステーキ”) .flatMap(recipes -> recipeClient.fetchLikedRecipeIds(recipes)) .subscribe(recipeIds -> {})

Page 166: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

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); } }

Page 167: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

// in your CustomApplicationpublic void onCreate(Bundle saveInstanceState){ super.onCreate(); System.setProperty("rx.ring-buffer.size", "32");}

Page 168: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)
Page 169: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Single.create(subscriber -> { subscriber.onSuccess("Hello world"); }).subscribe(text -> { System.out.println(text); }, throwable -> { Crashlytics.logException(e); });

Page 170: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)

Completable.create(subscriber -> { subscriber.onCompleted() }).subscribe(throwable -> { Crashlytics.logException(e); }, () -> { });

Page 171: 明日から使えるRxjava頻出パターン (Droid kaigi 2016)