15
Copyright 2014 Shiroyagi Corporation. All rights reserved. 2015-07-23 Realm Meetup 白ヤギコーポレーション Shiroyagi Corporation Niko Adrianus Yuwono

2015 07-23 Tokyo Realm Meetup

Embed Size (px)

Citation preview

Page 1: 2015 07-23 Tokyo Realm Meetup

Copyright 2014 Shiroyagi Corporation. All rights reserved.

2015-07-23 Realm Meetup

白ヤギコーポレーション Shiroyagi Corporation

Niko Adrianus Yuwono

Page 2: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

2

自己紹介Niko Adrianus YuwonoAndroid DeveloperGithub : https://github.com/NAYOSO

インドネシアから来ました!

Page 3: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

3

300万テーマから選べるニュースアプリ

1 好きなテーマを探す

2 フォローする

3 毎日ニュースが届く

使い方は簡単!

ベストアプリにも選ばれた「あなた色に染まる」ニュースアプリ

Page 4: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

4

RxJavaRxJavaはAsynchronousプログラミングのAPIです。ObservablesでAsynchronousデータの流れを表します。Observablesも色んなオペレータがあって、オペレータでObservableをフィルター、選択、変換、構成、そして組み合わせすることができます。

Page 5: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

5

Observableとは?・ObservableというObjectはタスクが終わったあとにSubscriberに通知して、SubscriberはObservableが発するものを操作します。 ・Observableは一つのタスクを待たずにSubscriberを使って、SubscriberがObservableを監視して、Observableのタスクが終わったら、Observableの結果をSubscriberにパスします。そのように、他のタスクをブロックしないので、複数のタスクを同時に操作することができます。

Page 6: 2015 07-23 Tokyo Realm Meetup

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を表示します。

Page 7: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

7

Observableを変換するObservableを変換する機能は多いですが、以下の三つの機能が最も採用されていると思います: - map():Mapという機能はObservableが発するものを変換して、同じタイプのものをreturnするか別のタイプのものもreturnすることができます。 - flatMap() : FlatMapという機能はObservableが発するものから他のObservableを作って、元のObservableをその新しいObservableに変換します。 - switchMap() : SwitchMapという機能はFlatMapに似ているのですが、SwitchMapは一番新しいObservableだけを操作します。

Page 8: 2015 07-23 Tokyo Realm Meetup

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」を発します。

Page 9: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

9

ObservableをフィルターするObservableが発するものもフィルタすることができます。例えば:Observable.from(new String[]{"Tokyo", "Osaka", "Jakarta", "Kanazawa"}) .filter(new Func1<String, Boolean>() { @Override public Boolean call(String text) { return cityOfJapanList.contains(text); } })

Page 10: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

10

AndroidのActivity/Fragment Lifecycleに関して

Androidアプリは普通のJavaアプリと違って、Activity/FragmentのLifecycleがあります。 例えばサーバーから取ったデータをUIに表示しますが、それはActivity/Fragmentがまだアクティブな状態の間だけ可能です。なので、エラーを防ぐ為にActivity/Fragmentが破壊される前にObservableからunsubscribeしてください。

Page 11: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

11

Unsubscribeの例 @Override protected void onDestroy() { helloSubscription.unsubscribe(); super.onDestroy(); }

Page 12: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

12

Activity/Fragment LifecycleObservable<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に通知しません。

Page 13: 2015 07-23 Tokyo Realm Meetup

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()).

Page 14: 2015 07-23 Tokyo Realm Meetup

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で使えないです。

Page 15: 2015 07-23 Tokyo Realm Meetup

Copyright 2015 Shiroyagi Corporation. All rights reserved.

機密

15

Question?