Slide 1

Slide 1 text

-JWF%BUB XJUI3Y+BWB TIJCVZBBQL !ZBUBUTV

Slide 2

Slide 2 text

ࣗݾ঺հ w๺઒ୡ໵ʢ,*5"("8"5BUTVZBʣ wגࣜձࣾΞϐϦοπ w"OESPJEΞϓϦͷडୗ։ൃ w(JU)VC!ZBUBUTV

Slide 3

Slide 3 text

-JWF%BUBͱ͸ʁ w(PPHMF*0Ͱൃද͞Εͨ
 "OESPJE"SDIJUFDUVSF$PNQPOFOU
 ͷػೳͷͻͱͭ w6*ͷϥΠϑαΠΫϧΛߟྀͨ͠
 σʔλͷมߋ؂ࢹ wݱ࣌఺ͷόʔδϣϯ͸BMQIB

Slide 4

Slide 4 text

PCTFSWF -JGFDZDMF0XOFS  0CTFSWFS5 LiveData textLiveData = viewModel.getMessage(); textLiveData.observe(this, text -> { // ͜͜͸ΞΫςΟϒͳͱ͖͚ͩݺ͹ΕΔ textView.setText(text); }); •LifecycleOwnerʹ͸ී௨Activity΍Fragment •UI͕ΞΫςΟϒͳঢ়ଶʢSTARTED, RESUMEDʣͰͷΈɺ
 σʔλͷมߋΛड͚औΔ͜ͱ͕Ͱ͖Δ

Slide 5

Slide 5 text

"OESPJE"SDIJUFDUVSF $PNQPOFOU 3&45"1* -PDBUJPO4FSWJDF %BUBCBTF 3FQPTJUPSZ 7JFX.PEFM -JWF%BUB5 -JWF%BUB5 "DUJWJUZ
 'SBHNFOU

Slide 6

Slide 6 text

3Y+BWBΛ͋Θͤͨߏ੒ 3&45"1* -PDBUJPO4FSWJDF %BUBCBTF -JWF%BUB5 'MPXBCMF5
 4JOHMF5
 $PNQMFUBCMF 3FQPTJUPSZ "DUJWJUZ
 'SBHNFOU 7JFX.PEFM

Slide 7

Slide 7 text

3Y+BWBUP-JWF%BUB "android.arch.lifecycle:reactivestreams:1.0.0-alpha3" LiveDataReactiveStreams.fromPublisher(Publisher) •RxJava2ͱͷม׵ϝιου͕༻ҙ͞Ε͍ͯΔ

Slide 8

Slide 8 text

GSPN1VCMJTIFS 1VCMJTIFS ʢൈਮʣ public static LiveData fromPublisher(final Publisher publisher) { MutableLiveData liveData = new MutableLiveData<>(); final WeakReference> liveDataRef = new WeakReference<>(liveData); publisher.subscribe(new Subscriber() { @Override public void onSubscribe(Subscription s) { s.request(Long.MAX_VALUE); } @Override public void onNext(final T t) { final LiveData liveData = liveDataRef.get(); if (liveData != null) { liveData.postValue(t); } }

Slide 9

Slide 9 text

εέδϡʔϥʹؾΛ͚ͭΔ •LiveData#postValue(T) •λεΫΛϝΠϯεϨου্Ͱ࣮ߦ͢Δ •LiveData͸ϝΠϯεϨουͰͷಈ࡞͕جຊ •ϝΠϯεϨουͰॲཧ͞ΕΔલʹɺ
 ෳ਺postValue͞ΕΔͱ࠷৽ͷ஋ͷΈૹ৴

Slide 10

Slide 10 text

GSPN1VCMJTIFS 1VCMJTIFS ʢൈਮʣ public static LiveData fromPublisher(final Publisher publisher) { // … publisher.subscribe(new Subscriber() { // … @Override public void onError(Throwable t) { // Errors should be handled upstream, so propagate as a crash. throw new RuntimeException(t); } @Override public void onComplete() { } }); return liveData; }

Slide 11

Slide 11 text

-JWF%BUBͷΤϥʔॲཧ •LiveData͸ྫ֎ΛϋϯυϦϯά͠ͳ͍ •ม׵͢Δࡍʹ͸ΤϥʔΛϥοϓ͢Δඞཁ͕͋Δ

Slide 12

Slide 12 text

-JWF%BUBͷΤϥʔॲཧʢྫʣ // TODOΛDB͔Βऔಘ͢Δαϯϓϧ // ্ྲྀͰΤϥʔ͕͋ͬͨͱ͖ʹͦͷ··ྫ֎Λ౤͛Δ LiveData> getTodos(TodoStatus status) { Flowable> list = todoDb.todoDao().findByStatus(status) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); return LiveDataReactiveStreams.fromPublisher(list); }

Slide 13

Slide 13 text

-JWF%BUBͷΤϥʔॲཧʢྫʣ public class LoadState { private boolean loading; private T data; private Throwable error; public LoadState(boolean loading, @Nullable T data, @Nullable Throwable error) { this.loading = loading; this.data = data; this.error = error; }

Slide 14

Slide 14 text

-JWF%BUBͷΤϥʔॲཧʢྫʣ LiveData>> getTodos(TodoStatus status) { Flowable>> state = todoDb.todoDao().findByStatus(status) .map(LoadState::data) // औಘ੒ޭ .onErrorReturn(LoadState::error) // Τϥʔ .startWith(LoadState.loading()) // ϩʔσΟϯά .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); return LiveDataReactiveStreams.fromPublisher(state); }

Slide 15

Slide 15 text

JPSFBDUJWFY$PNQMFUBCMF •onComplete, onError •ฦΓ஋Λ΋ͨͣ݁Ռͷ׬ྃɺࣦഊ͚ͩΛ஌Γ͍ͨͱ ͖ʹར༻͞ΕΔ •REST APIͷPOST, ϩʔΧϧσʔλͷ࡟আͳͲ

Slide 16

Slide 16 text

$PNQMFUBCMFUP-JWF%BUB •LiveDataͰදݱ͍ͨ͠ •Flowableʹม׵͢Δ •׬ྃ/ࣦഊΛΦϒδΣΫτͰද͢

Slide 17

Slide 17 text

ࣦഊɾ׬ྃΛද͢ΦϒδΣΫτ public interface AddTodoState { final class None implements AddTodoState {} final class Loading implements AddTodoState {} final class Error implements AddTodoState { final Throwable throwable; public Error(Throwable throwable) { this.throwable = throwable; } public Throwable getThrowable() { return throwable; } } final class Complete implements AddTodoState {} }

Slide 18

Slide 18 text

$PNQMFUBCMFUP-JWF%BUB MutableLiveData addTodoState = new MutableLiveData<>(); Completable completable = todoRepository.addTodo(todo); Disposable disposable = completable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .toSingle(AddTodoState.Complete::new) .toObservable() .cast(AddTodoState.class) .onErrorReturn(AddTodoState.Error::new) .startWith(new AddTodoState.Loading()) .subscribe(addTodoState::setValue);

Slide 19

Slide 19 text

·ͱΊ w 3Y+BWB͔Β-JWF%BUBʹม׵͕Ͱ͖Δ w -JWF%BUB͸ϝΠϯεϨου͕جຊͳͷͰ
 ม׵͢Δͱ͖εέδϡʔϥʹؾΛ͚ͭΔ w ΤϥʔΛϥοϓͨ͠ΦϒδΣΫτΛ஋ʹ͢Δ w $PNQMFUBCMF͸ঢ়ଶΛ஋ʹ͢Δ

Slide 20

Slide 20 text

ࢀߟϦϯΫ w αϯϓϧίʔυ
 IUUQTHJUIVCDPNZBUBUTVBOESPJEBSDIUPEPTBNQMF w ެࣜͷαϯϓϧϦϙδτϦ
 IUUQTHJUIVCDPNHPPHMFTBNQMFTBOESPJEBSDIJUFDUVSFDPNQPOFOUT USFFNBTUFS(JUIVC#SPXTFS4BNQMF w (PPHMF*0ͷηογϣϯ
 "SDIJUFDUVSF$PNQPOFOUT4PMWJOHUIF-JGFDZDMF1SPCMFN (PPHMF*0  :PV5VCF
 IUUQTXXXZPVUVCFDPNXBUDI WC&,/J+0S/T w ެࣜυΩϡϝϯτ
 -JWF%BUBc"OESPJE%FWFMPQFST
 IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFMJWFEBUBIUNM

Slide 21

Slide 21 text

͓ΘΓ w͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ