Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Using Realm with RxJava
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Daichi Furiya (Wasabeef)
April 23, 2015
Programming
2.5k
13
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Using Realm with RxJava
Using Realm with RxJava
Daichi Furiya (Wasabeef)
April 23, 2015
More Decks by Daichi Furiya (Wasabeef)
See All by Daichi Furiya (Wasabeef)
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
6
2.8k
About Flutter Architecture
wasabeef
1
320
2023 Flutter/Dart Summary
wasabeef
0
130
I/O Extended 2023 - Dart と Flutter の新機能
wasabeef
0
230
I/O Extended 2023 - Flutter 活用事例
wasabeef
10
3.1k
What it Takes to be a Flutter Developer
wasabeef
0
250
FlutterKaigi 2022 Keynote
wasabeef
1
720
Flutter Hooks を使ったアプリ開発 / App Development with the Flutter Hooks
wasabeef
2
1.5k
Flutter 2021 の振り返りと今後のアプリ開発に向けて / Looking back on Flutter 2021 and for future app development.
wasabeef
4
2.2k
Other Decks in Programming
See All in Programming
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.8k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
740
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
300
RTSPクライアントを自作してみた話
simotin13
0
630
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
140
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
170
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
12
6.1k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
160
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
740
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
170
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
800
Lessons from Spec-Driven Development
simas
PRO
0
220
Featured
See All Featured
Un-Boring Meetings
codingconduct
0
320
Navigating Team Friction
lara
192
16k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
170
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Designing for Timeless Needs
cassininazir
1
260
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Transcript
Using Realm with RxJava Wasabeef
About Me wasabeef CyberAgent, Inc.
Realm Latest v0.80.1 (2015.4.23)
Introduction
Realm
Realm.getInstance() Realm realm = Realm.getInstance(this);
RealmObject public class User extends RealmObject { /** Other fields…
**/ }
RealmList<T> public class User extends RealmObject { private RealmList<Email> emails;
/** Other fields… **/ }
RealmQuery<T> RealmQuery<User> query = realm.where(User.class); query.equalTo(“name”, “Wasabeef”);
RealmResults<T> RealmResults<User> result = query.findAll();
RxJava
Observable<T> String[] names = {“Wasabeef”, “Chip”}; ! Observable.from(names).subscribe(s -> {
Log.d(“Hello ” + s); });
map, flatMap… etc. Observable.from(names) .subscribeOn(Schedulers.newThread()) .map(new Func1<String, String>() { @Override
public String call(String name) { return name.toUpperCase(); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s -> { Log.d(“Hello ” + s); });
subscribe(onNext, onError..) Observable.from(names).subscribe( new Observer<String>() { @Override public void onCompleted()
{ } ! @Override public void onError(Throwable e) { } ! @Override public void onNext(String s) { } });
Wrapping Realm around RxJava Source: http://kboyarshinov.com/android/wrapping-realm-around-rxjava/
issues #865
issue #865 ! // Get observable of all users Realm.getInstance(context)
.where(User.class) .findAll() .observable() .subscribe(users -> { // do stuff with users });
Defining Realm model public class RealmUser extends RealmObject { private
String name; ! public String getName() { return name; } ! public void setName(String name) { this.name = name; } }
Defining Immutable POJO public class User { private String name;
! public User(String name) { this.name = name; } ! public String getName() { return name; } }
Observing Realm
public abstract class OnSubscribeRealm<T extends RealmObject> implements Observable.OnSubscribe<T> { !
/** constructor **/ ! @Override public void call(final Subscriber<? super T> subscriber) { Realm realm = Realm.getInstance(context); subscriber.add(Subscriptions.create(() -> { try { realm.close(); } catch (RealmException ex) { subscriber.onError(ex); } })); ! T object; realm.beginTransaction(); try { object = get(realm); realm.commitTransaction(); } catch (RuntimeException e) { realm.cancelTransaction(); subscriber.onError(new RealmException(Error during transaction., e)); return; } catch (Error e) { realm.cancelTransaction(); subscriber.onError(e); return; } if (object != null) { subscriber.onNext(object); } subscriber.onCompleted(); } ! public abstract T get(Realm realm); }
public final class RealmObservable { ! private RealmObservable() { }
! public static <T extends RealmObject> Observable<T> object( Context context, Func1<Realm, T> function) { ! return Observable.create(new OnSubscribeRealm<T>(context) { @Override public T get(Realm realm) { return function.call(realm); } }); } }
public class RealmDataService { private Context context; ! public RealmDataService(Context
context) { this.context = context.getApplicationContext(); } ! public Observable<User> addUser(String userName) { return RealmObservable.object(context, new Func1<Realm, RealmUser>() { @Override public RealmUser call(Realm realm) { RealmUser realmUser = new RealmUser(); realmUser.setName(userName); return realm.copyToRealm(realmUser); } }).map(new Func1<RealmUser, User>() { @Override public User call(RealmUser realmUser) { // map to UI object return new User(realmUser.getName()); } }); } } Data Service
Usage private void addUser() { Subscription subscription = dataService.addUser(“Wasabeef”) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .subscribe( user -> /** use user data **/, throwable -> /** error! **/ ); if (compositeSubscription != null) { compositeSubscription.add(subscription); } }
Wasabeef
CyberAgent, Inc.
Thanks.