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
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
Claspは野良GASの夢をみるか
takter00
0
210
Oxlintのカスタムルールの現況
syumai
6
1.1k
Oxcを導入して開発体験が向上した話
yug1224
4
340
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
320
New "Type" system on PicoRuby
pocke
1
1k
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
130
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
180
Vite+ Unified Toolchain for the Web
naokihaba
0
340
1B+ /day規模のログを管理する技術
broadleaf
0
110
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
Featured
See All Featured
Building the Perfect Custom Keyboard
takai
2
800
The Limits of Empathy - UXLibs8
cassininazir
1
370
Into the Great Unknown - MozCon
thekraken
41
2.6k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
250
Believing is Seeing
oripsolob
1
150
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
370
Become a Pro
speakerdeck
PRO
31
6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
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.