狠狠撸

狠狠撸Share a Scribd company logo
Copyright 2014 Shiroyagi Corporation. All rights reserved.
2015-07-23
Realm Meetup
白ヤギコーポレーション
Shiroyagi Corporation
Niko Adrianus Yuwono
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
2
自己紹介
Niko Adrianus Yuwono
Android Developer
Github : https://github.com/NAYOSO
インドネシアから来ました!
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
3
300万テーマから選べるニュースアプリ
1 好きなテーマを探す
2 フォローする
3 毎日ニュースが届く
使い方は簡単!
ベストアプリにも選ばれた「あなた色に染まる」ニュースアプリ
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
4
RxJava
RxJavaはAsynchronousプログラミングのAPIです。
ObservablesでAsynchronousデータの流れを表しま
す。Observablesも色んなオペレータがあって、オペ
レータでObservableをフィルター、選択、変換、構
成、そして組み合わせすることができます。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
5
Observableとは?
?ObservableというObjectはタスクが終わったあとに
Subscriberに通知して、SubscriberはObservableが発
するものを操作します。
?Observableは一つのタスクを待たずにSubscriberを
使って、SubscriberがObservableを監視して、
Observableのタスクが終わったら、Observableの結果
をSubscriberにパスします。そのように、他のタスクを
ブロックしないので、複数のタスクを同時に操作すること
ができます。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
6
Observableとは?
Observable
.create(subscriber -> subscriber.onNext("カメリオ"))
.subscribe(text -> Toast.makeText(MainActivity.this, text,
Toast.LENGTH_SHORT));
このコードで「カメリオ」Stringを発するObservableを作っ
て、SubscriberがそのStringを受け取って、そのStringか
らToastを表示します。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
7
Observableを変換する
Observableを変換する機能は多いですが、以下の三つの機能
が最も採用されていると思います:
- map():Mapという機能はObservableが発するものを変換
して、同じタイプのものをreturnするか別のタイプのものも
returnすることができます。
- ?atMap() : FlatMapという機能はObservableが発するもの
から他のObservableを作って、元のObservableをその新し
いObservableに変換します。
- switchMap() : SwitchMapという機能はFlatMapに似てい
るのですが、SwitchMapは一番新しいObservableだけを操作
します。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
8
Mapの例
Observable.
create(subscriber -> subscriber.onNext("カメリオ"))
.map(text -> text + " Android");
このコードでObservableが「カメリオ」Stringを発して、
Map機能がそのStringを変換して、「 Android」Stringを
連結して、最後にObservableが「カメリオ Android」を
発します。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
9
Observableをフィルターする
Observableが発するものもフィルタすることができます。
例えば:
Observable.from(new String[]{"Tokyo", "Osaka", "Jakarta",
"Kanazawa"})
.?lter(new Func1<String, Boolean>() {
@Override
public Boolean call(String text) {
return cityOfJapanList.contains(text);
}
})
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
10
AndroidのActivity/Fragment Lifecycleに関して
Androidアプリは普通のJavaアプリと違って、Activity/
FragmentのLifecycleがあります。
例えばサーバーから取ったデータをUIに表示しますが、そ
れはActivity/Fragmentがまだアクティブな状態の間だけ
可能です。なので、エラーを防ぐ為にActivity/Fragment
が破壊される前にObservableからunsubscribeしてくださ
い。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
11
Unsubscribeの例
@Override
protected void onDestroy() {
helloSubscription.unsubscribe();
super.onDestroy();
}
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
12
Activity/Fragment Lifecycle
Observable<String> activityBindedObservable =
Observable.create(subscriber ->
subscriber.onNext("Hello RxAndroid"))
.map(text -> text.hashCode())
.map(hashcode -> String.valueOf(hashcode));
AppObservable.bindActivity(this, activityBindedObservable).
subscribe(text -> Toast.makeText(MainActivity.this,
text, Toast.LENGTH_SHORT));
幸いにもこのケースの為にHelper機能があります。ObservableのSubscriber
を登録する時にAppObservable.bindActivity()/bindFragment()という機能
を使って、その機能がActivity/Fragmentが破壊される前にそのObservable
をunsubscribeします。そうするとObservableがSubscriberに通知しません。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
13
Threadに関して
もしObservableにどんなThreadでsubscribeするか、も
しくはobserveするかを特定しない場合に、Observableが
タスクを行うか、もしくは結果をパスする時にAndroidの
Main Threadを使います。私の意見では、それはあまり良
くないことと考えています。全部のタスクがMain Thread
で行われたらアプリが重くなり、ユーザーからしてもあま
りよくないので、subscribeOn()とobserveOn()機能を
使って、Threadを特定してください。
例えば、subscribeOn(Schedulers.io()) と
observeOn(AndroidSchedulers.mainThread()).
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
14
Realmと連携
RealmはRxJavaの公式サポートはまだまだないですが、
RealmのIssue一覧でAsync Queryについて話があるので、
多分これからRxJavaのサポートもあります。
!
RxJavaとRealmの連携の問題は?
RealmObjectとRealmResultsは一つのThreadから他の
Threadにパス出来ないです。
例えば、Background ThreadでQueryしたら、UI Thread
で使えないです。
Copyright 2015 Shiroyagi Corporation. All rights reserved.
機密
15
Question?

More Related Content

2015 07-23 Tokyo Realm Meetup

  • 1. Copyright 2014 Shiroyagi Corporation. All rights reserved. 2015-07-23 Realm Meetup 白ヤギコーポレーション Shiroyagi Corporation Niko Adrianus Yuwono
  • 2. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 2 自己紹介 Niko Adrianus Yuwono Android Developer Github : https://github.com/NAYOSO インドネシアから来ました!
  • 3. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 3 300万テーマから選べるニュースアプリ 1 好きなテーマを探す 2 フォローする 3 毎日ニュースが届く 使い方は簡単! ベストアプリにも選ばれた「あなた色に染まる」ニュースアプリ
  • 4. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 4 RxJava RxJavaはAsynchronousプログラミングのAPIです。 ObservablesでAsynchronousデータの流れを表しま す。Observablesも色んなオペレータがあって、オペ レータでObservableをフィルター、選択、変換、構 成、そして組み合わせすることができます。
  • 5. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 5 Observableとは? ?ObservableというObjectはタスクが終わったあとに Subscriberに通知して、SubscriberはObservableが発 するものを操作します。 ?Observableは一つのタスクを待たずにSubscriberを 使って、SubscriberがObservableを監視して、 Observableのタスクが終わったら、Observableの結果 をSubscriberにパスします。そのように、他のタスクを ブロックしないので、複数のタスクを同時に操作すること ができます。
  • 6. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 6 Observableとは? Observable .create(subscriber -> subscriber.onNext("カメリオ")) .subscribe(text -> Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT)); このコードで「カメリオ」Stringを発するObservableを作っ て、SubscriberがそのStringを受け取って、そのStringか らToastを表示します。
  • 7. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 7 Observableを変換する Observableを変換する機能は多いですが、以下の三つの機能 が最も採用されていると思います: - map():Mapという機能はObservableが発するものを変換 して、同じタイプのものをreturnするか別のタイプのものも returnすることができます。 - ?atMap() : FlatMapという機能はObservableが発するもの から他のObservableを作って、元のObservableをその新し いObservableに変換します。 - switchMap() : SwitchMapという機能はFlatMapに似てい るのですが、SwitchMapは一番新しいObservableだけを操作 します。
  • 8. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 8 Mapの例 Observable. create(subscriber -> subscriber.onNext("カメリオ")) .map(text -> text + " Android"); このコードでObservableが「カメリオ」Stringを発して、 Map機能がそのStringを変換して、「 Android」Stringを 連結して、最後にObservableが「カメリオ Android」を 発します。
  • 9. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 9 Observableをフィルターする Observableが発するものもフィルタすることができます。 例えば: Observable.from(new String[]{"Tokyo", "Osaka", "Jakarta", "Kanazawa"}) .?lter(new Func1<String, Boolean>() { @Override public Boolean call(String text) { return cityOfJapanList.contains(text); } })
  • 10. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 10 AndroidのActivity/Fragment Lifecycleに関して Androidアプリは普通のJavaアプリと違って、Activity/ FragmentのLifecycleがあります。 例えばサーバーから取ったデータをUIに表示しますが、そ れはActivity/Fragmentがまだアクティブな状態の間だけ 可能です。なので、エラーを防ぐ為にActivity/Fragment が破壊される前にObservableからunsubscribeしてくださ い。
  • 11. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 11 Unsubscribeの例 @Override protected void onDestroy() { helloSubscription.unsubscribe(); super.onDestroy(); }
  • 12. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 12 Activity/Fragment Lifecycle Observable<String> activityBindedObservable = Observable.create(subscriber -> subscriber.onNext("Hello RxAndroid")) .map(text -> text.hashCode()) .map(hashcode -> String.valueOf(hashcode)); AppObservable.bindActivity(this, activityBindedObservable). subscribe(text -> Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT)); 幸いにもこのケースの為にHelper機能があります。ObservableのSubscriber を登録する時にAppObservable.bindActivity()/bindFragment()という機能 を使って、その機能がActivity/Fragmentが破壊される前にそのObservable をunsubscribeします。そうするとObservableがSubscriberに通知しません。
  • 13. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 13 Threadに関して もしObservableにどんなThreadでsubscribeするか、も しくはobserveするかを特定しない場合に、Observableが タスクを行うか、もしくは結果をパスする時にAndroidの Main Threadを使います。私の意見では、それはあまり良 くないことと考えています。全部のタスクがMain Thread で行われたらアプリが重くなり、ユーザーからしてもあま りよくないので、subscribeOn()とobserveOn()機能を 使って、Threadを特定してください。 例えば、subscribeOn(Schedulers.io()) と observeOn(AndroidSchedulers.mainThread()).
  • 14. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 14 Realmと連携 RealmはRxJavaの公式サポートはまだまだないですが、 RealmのIssue一覧でAsync Queryについて話があるので、 多分これからRxJavaのサポートもあります。 ! RxJavaとRealmの連携の問題は? RealmObjectとRealmResultsは一つのThreadから他の Threadにパス出来ないです。 例えば、Background ThreadでQueryしたら、UI Thread で使えないです。
  • 15. Copyright 2015 Shiroyagi Corporation. All rights reserved. 機密 15 Question?