狠狠撸

狠狠撸Share a Scribd company logo
2015.11.27
オープンソースライブラリ研究会
Android編
Shun Nakahara
自己紹介
? Shun Nakahara
? 27
? iOS/Android
? iOS 大好きです!
? @shun_nakahara
全員エンジニア合コンをやってみた
人生初の合コン
FiNC 紹介
一生に一度のかけがえのない人生の成功をサポートする
iOS 大好きです!!
iOS で発表したかったんですが…
RxJava + Retrofit
RxJava + Retrofit
? RxJava を簡単に紹介
? Retro?t を簡単に紹介
? 二つを合わせたテクニックを紹介
RxJava
RxJava
? Reactive Extensions Java
? リアクティブプログラミングをするためのライブラリ
? 同期処理、非同期処理、遅延実行…
RxJava
? 基本的な使い方
? 非同期処理
? 同期処理
? RxAndroid
Gradle の準備
// RxJava?
compile 'io.reactivex:rxjava:1.0.15'
基本的な書き方
String name = “shun";
?
Subscription subscription = Observable.from(new String[]{name}).subscribe(new Action1<String>() {?
@Override?
public void call(String string) {?
String name = "nakahara " + string;?
System.out.print(name);?
}?
});
?
subscription.unsubscribe();
基本的な処理を便利に!?
Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {?
@Override?
public void call(Subscriber<? super String> subscriber) {?
final String name = "shun"; // 重い処理などをここで行う。?
String fullName = "nakahara " + name;?
?
subscriber.onNext(fullName);?
subscriber.onCompleted();?
}?
};
?
Subscription subscription = Observable.create(onSubscribe).subscribe(new Action1<String>() {?
@Override?
public void call(String string) {?
System.out.print(string);?
}?
});
?
subscription.unsubscribe();
非同期処理
Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {?
@Override?
public void call(Subscriber<? super String> subscriber) {?
?
// 通信処理?
?
boolean isSuccess = false;?
String response = "response";?
if (isSuccess) {?
subscriber.onNext(response);?
subscriber.onCompleted();?
} else {?
subscriber.onError(new NetworkErrorException("connect error"));?
}?
}?
};?
Observable<String> stringObservable = Observable.create(onSubscribe);?
stringObservable.subscribe(new Observer<String>() {?
@Override?
public void onCompleted() {?
// network completed?
}?
?
@Override?
public void onError(Throwable e) {?
// network error message?
}?
?
@Override?
public void onNext(String string) {?
// network success response?
}?
});
同期処理を書きたい時
Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {?
@Override?
public void call(Subscriber<? super String> subscriber) {?
?
// 通信処理?
?
boolean isSuccess = false;?
String response = "response";?
if (isSuccess) {?
subscriber.onNext(response);?
subscriber.onCompleted();?
} else {?
subscriber.onError(new NetworkErrorException("connect error"));?
}?
}?
};?
?
Observable<String> stringObservable = Observable.create(onSubscribe);?
?
String response = stringObservable.toBlocking().single();?
if (response == null) {?
// error?
} else {?
// success?
}
気づいた人いますか?
メソッドに切す
public Observable<String> request() {?
Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {?
@Override?
public void call(Subscriber<? super String> subscriber) {?
?
// 通信処理?
?
boolean isSuccess = false;?
String response = "response";?
if (isSuccess) {?
subscriber.onNext(response);?
subscriber.onCompleted();?
} else {?
subscriber.onError(new NetworkErrorException("connect error"));?
}?
}?
};?
return Observable.create(onSubscribe);?
}
非同期処理
request().subscribe(new Observer<String>() {?
@Override?
public void onCompleted() {?
// network completed?
}?
?
@Override?
public void onError(Throwable e) {?
// network error?
}?
?
@Override?
public void onNext(String s) {?
// response call back?
}?
});
同期処理
String response = request().toBlocking().single();?
if (response == null) {?
// network error?
} else {?
// response call back?
}
なんだかこれだと使えそうな
気がしますね!d( ̄  ̄)
RxAndroid
? Reactive Extensions Android
? リアクティブプログラミングをするためのライブラリ
? 同期処理、非同期処理、遅延実行…
? RxJavaを内包しAndroidで利用するための機能を追加
? Android Handler / Thread 処理
RxAndroid…他にも
? RxLifecycle
? RxBinding
? SqlBrite
? Android-ReactiveLocation
? rx-preferences
RxAndroid
? AndroidSchedulers
? HandlerSchedulers
Gradle の準備
// RxJava?
compile 'io.reactivex:rxjava:1.0.15'?
?
// RXAndroid?
compile 'io.reactivex:rxandroid:1.0.1'
Android Schedulers
request().subscribeOn(Schedulers.newThread())?
.observeOn(AndroidSchedulers.mainThread())?
.subscribe(new Observer<String>() {?
@Override?
public void onCompleted() {?
// network completed
// main thread?
}?
?
@Override?
public void onError(Throwable e) {?
// network error?
// main thread?
}?
?
@Override?
public void onNext(String s) {?
// response call back?
// main thread?
}?
});
Handler Schedulers
Handler handler = new Handler();?
request().subscribeOn(Schedulers.newThread())?
.observeOn(HandlerScheduler.from(handler))?
.subscribe(new Observer<String>() {?
@Override?
public void onCompleted() {?
// network completed?
// handler thread?
}?
?
@Override?
public void onError(Throwable e) {?
// network error?
// handler thread?
}?
?
@Override?
public void onNext(String s) {?
// response call back?
// handler thread?
}?
});
RxJava わかってきたところで
Retrofit
Retrofit
? A Type safe HTTP client for Android and Java
? Android の為の REST 通信を手軽に実装できる!?
? Retro?t 2.0.0-bata2 を利用します。
Retrofit
? 基本的な使い方
? 非同期処理
? 同期処理
? RxJava を組み込んでみる
Gradle の準備
// Retrofit?
compile ‘com.squareup.retrofit:retrofit:2.0.0-beta2'
// gson?
compile ‘com.google.code.gson:gson:2.4'
// Converter Gson?
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'?
Proguard の準備
# Retrofit Proguard?
-dontwarn retrofit.**?
-keep class retrofit.** { *; }?
-keepattributes Signature?
-keepattributes Exceptions
基本的な使い方
Model Class の作成
public class SignIn {?
@SerializedName("access_token")?
public final String accessToken;?
?
@SerializedName("user_id")?
public final int userId;?
?
@SerializedName("group_id")?
public final int group_id;?
?
public SignIn(String accessToken, int userId, int group_id) {?
this.accessToken = accessToken;?
this.userId = userId;?
this.group_id = group_id;?
}?
}
Service Interface 作成
public interface UsersService {?
@FormUrlEncoded?
@POST("/v3/users/sign_in")?
Call<SignIn> signIn(@Field("email") String email, @Field("password") String password);?
}
Service Interface 作成
public interface UsersService {?
@FormUrlEncoded?
@POST("/v3/users/sign_in")?
Call<SignIn> signIn(@Field("email") String email, @Field("password") String password);?
}
非同期処理
// Gson Converter Factory?
GsonConverterFactory factory = GsonConverterFactory.create(new Gson());?
?
// Retrofit?
Retrofit retrofit = new Retrofit.Builder()?
.baseUrl(baseUrl)?
.addConverterFactory(factory)?
.build();?
?
// Users Service?
UsersService usersService = retrofit.create(UsersService.class);?
?
// Call?
Call<SignIn> call = usersService.signIn(Email, Password);?
call.enqueue(new Callback<SignIn>() {?
@Override?
public void onResponse(Response<SignIn> response, Retrofit retrofit) {?
// network success?
}?
?
@Override?
public void onFailure(Throwable t) {?
// network error?
}?
});
同期処理
// Gson Converter Factory?
GsonConverterFactory factory = GsonConverterFactory.create(new Gson());?
?
// Retrofit?
Retrofit retrofit = new Retrofit.Builder()?
.baseUrl(baseUrl)?
.addConverterFactory(factory)?
.build();?
?
// Users Service?
UsersService usersService = retrofit.create(UsersService.class);?
?
// Call?
Call<SignIn> call = usersService.signIn(Email, Password);?
try {?
Response<SignIn> response = call.execute();?
} catch (IOException e) {?
e.printStackTrace();?
}
???
クラッシュ
RxJava + Retrofit
Service Interface(RxJava版)
public interface UsersService {?
@FormUrlEncoded?
@POST("/v3/users/sign_in")?
Observable<SignIn> signIn(@Field("email") String email, @Field("password") String password);?
}?
非同期処理(RxJava版)
// Gson Converter Factory?
GsonConverterFactory factory = GsonConverterFactory.create(new Gson());?
?
// RxJava Call Adapter?
RxJavaCallAdapterFactory adapterFactory = RxJavaCallAdapterFactory.create();?
?
// Retrofit?
Retrofit retrofit = new Retrofit.Builder()?
.baseUrl(baseUrl)?
.addConverterFactory(factory)?
.addCallAdapterFactory(adapterFactory)?
.build();?
?
// Users Service?
UsersService usersService = retrofit.create(UsersService.class);?
?
// User Service?
Observable<SignIn> observable = usersService.signIn(Email, Password);?
observable.subscribeOn(Schedulers.newThread())?
.observeOn(AndroidSchedulers.mainThread())?
.subscribe(new Observer<SignIn>() {?
@Override?
public void onCompleted() {?
// network completed?
}?
?
@Override?
public void onError(Throwable e) {?
// network error?
}?
?
@Override?
public void onNext(SignIn signIn) {?
// network success?
}?
});
同期処理(RxJava版)
// Gson Converter Factory?
GsonConverterFactory factory = GsonConverterFactory.create(new Gson());?
?
// RxJava Call Adapter?
RxJavaCallAdapterFactory adapterFactory = RxJavaCallAdapterFactory.create();?
?
// Retrofit?
Retrofit retrofit = new Retrofit.Builder()?
.baseUrl(baseUrl)?
.addConverterFactory(factory)?
.addCallAdapterFactory(adapterFactory)?
.build();?
?
// Users Service?
UsersService usersService = retrofit.create(UsersService.class);?
?
// Call?
Observable<SignIn> observable = usersService.signIn(Email, Password);?
SignIn signIn = observable?
.subscribeOn(Schedulers.newThread())?
.toBlocking()?
.single();?
?
if (signIn == null) {?
// network error?
} else {?
// network success?
}
Retrofit でハマったこと
Retrofit でハマったこと
? Twitter Kit では Retro?t 1.8 を使っている
? Retro?t 1.8-1.9 と Retro?t 2.0 で設定の変更
? Retro?t 2.0 では、RxJava の Call Adapter が必要
ありがとうございました。

More Related Content

What's hot (20)

Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
?
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
?
Reactive Extensions v2.0
Reactive Extensions v2.0Reactive Extensions v2.0
Reactive Extensions v2.0
Yoshifumi Kawai
?
linq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScriptlinq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScript
Yoshifumi Kawai
?
Go conference 2017 Lightning talk
Go conference 2017 Lightning talkGo conference 2017 Lightning talk
Go conference 2017 Lightning talk
mokelab
?
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Kohei KaiGai
?
GoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作る
GoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作るGoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作る
GoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作る
Masahiro Wakame
?
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
Kouji Hosoda
?
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Uehara Junji
?
搁虫に入门しようとしている
搁虫に入门しようとしている搁虫に入门しようとしている
搁虫に入门しようとしている
onotchi_
?
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
Uehara Junji
?
An Internal of LINQ to Objects
An Internal of LINQ to ObjectsAn Internal of LINQ to Objects
An Internal of LINQ to Objects
Yoshifumi Kawai
?
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
?
窜测苍辩惭笔の蚕贰惭鲍
窜测苍辩惭笔の蚕贰惭鲍窜测苍辩惭笔の蚕贰惭鲍
窜测苍辩惭笔の蚕贰惭鲍
Mr. Vengineer
?
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
?
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
?
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Takefumi MIYOSHI
?
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
?
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
Yuto Takei
?
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
?
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Yoshifumi Kawai
?
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
?
linq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScriptlinq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScript
Yoshifumi Kawai
?
Go conference 2017 Lightning talk
Go conference 2017 Lightning talkGo conference 2017 Lightning talk
Go conference 2017 Lightning talk
mokelab
?
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Kohei KaiGai
?
GoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作る
GoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作るGoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作る
GoCon 2015 Summer 骋辞の础厂罢をいじくって新しいツールを作る
Masahiro Wakame
?
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
Kouji Hosoda
?
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Uehara Junji
?
搁虫に入门しようとしている
搁虫に入门しようとしている搁虫に入门しようとしている
搁虫に入门しようとしている
onotchi_
?
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
Uehara Junji
?
An Internal of LINQ to Objects
An Internal of LINQ to ObjectsAn Internal of LINQ to Objects
An Internal of LINQ to Objects
Yoshifumi Kawai
?
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
?
窜测苍辩惭笔の蚕贰惭鲍
窜测苍辩惭笔の蚕贰惭鲍窜测苍辩惭笔の蚕贰惭鲍
窜测苍辩惭笔の蚕贰惭鲍
Mr. Vengineer
?
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
なおき きしだ
?
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
?
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Takefumi MIYOSHI
?
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
?
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
Yuto Takei
?
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
?

Viewers also liked (13)

RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
Dev2Dev
?
Dagger & rxjava & retrofit
Dagger & rxjava & retrofitDagger & rxjava & retrofit
Dagger & rxjava & retrofit
Ted Liang
?
Retrofit Android by Chris Ollenburg
Retrofit Android by Chris OllenburgRetrofit Android by Chris Ollenburg
Retrofit Android by Chris Ollenburg
Trey Robinson
?
Retrofit
RetrofitRetrofit
Retrofit
bresiu
?
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
Tomá? Kypta
?
Introduction to rx java for android
Introduction to rx java for androidIntroduction to rx java for android
Introduction to rx java for android
Esa Firman
?
Introduction to Retrofit and RxJava
Introduction to Retrofit and RxJavaIntroduction to Retrofit and RxJava
Introduction to Retrofit and RxJava
Fabio Collini
?
Realm: Building a mobile database
Realm: Building a mobile databaseRealm: Building a mobile database
Realm: Building a mobile database
Christian Melchior
?
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJava
Ali Muzaffar
?
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Yuki Anzai
?
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
Ryutaro Miyashita
?
Retrofitting
RetrofittingRetrofitting
Retrofitting
Rizwan Samor
?
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
Aaron Irizarry
?
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
Dev2Dev
?
Dagger & rxjava & retrofit
Dagger & rxjava & retrofitDagger & rxjava & retrofit
Dagger & rxjava & retrofit
Ted Liang
?
Retrofit Android by Chris Ollenburg
Retrofit Android by Chris OllenburgRetrofit Android by Chris Ollenburg
Retrofit Android by Chris Ollenburg
Trey Robinson
?
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
Tomá? Kypta
?
Introduction to rx java for android
Introduction to rx java for androidIntroduction to rx java for android
Introduction to rx java for android
Esa Firman
?
Introduction to Retrofit and RxJava
Introduction to Retrofit and RxJavaIntroduction to Retrofit and RxJava
Introduction to Retrofit and RxJava
Fabio Collini
?
Realm: Building a mobile database
Realm: Building a mobile databaseRealm: Building a mobile database
Realm: Building a mobile database
Christian Melchior
?
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJava
Ali Muzaffar
?
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Yuki Anzai
?
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
Ryutaro Miyashita
?
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
Aaron Irizarry
?

Similar to Rx java x retrofit (20)

React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
dcubeio
?
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
Yatabe Terumasa
?
絶対落ちないアフ?リの作り方
絶対落ちないアフ?リの作り方絶対落ちないアフ?リの作り方
絶対落ちないアフ?リの作り方
Fumihiko Shiroyama
?
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Toshiyuki Ienaga
?
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
Akira Shimosako
?
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
Yuji Kubota
?
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
?
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Akio Katayama
?
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
kamiyam .
?
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
yo_waka
?
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
?
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
Ayumi Goto
?
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
Masaki Kubo
?
尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発
尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発
尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発
Shinobu Okano
?
搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门
搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门
搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门
spring_raining
?
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, PerformanceJavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
クラスメソッド株式会社
?
狈辞诲别.箩蝉でブラウザメッセンジャー
狈辞诲别.箩蝉でブラウザメッセンジャー狈辞诲别.箩蝉でブラウザメッセンジャー
狈辞诲别.箩蝉でブラウザメッセンジャー
驰补丑辞辞!デベロッパーネットワーク
?
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
?
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライ
Masanobu Sato
?
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
dcubeio
?
ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用ソーシャルアプリ勉强会(第一回资料)配布用
ソーシャルアプリ勉强会(第一回资料)配布用
Yatabe Terumasa
?
絶対落ちないアフ?リの作り方
絶対落ちないアフ?リの作り方絶対落ちないアフ?リの作り方
絶対落ちないアフ?リの作り方
Fumihiko Shiroyama
?
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Toshiyuki Ienaga
?
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
Akira Shimosako
?
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
Yuji Kubota
?
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
?
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
Akio Katayama
?
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
kamiyam .
?
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
yo_waka
?
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
Yuichi Sakuraba
?
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
Masaki Kubo
?
尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発
尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発
尝颈驳丑迟飞别颈驳丑迟-厂迟谤别补尘-础笔滨のある础苍诲谤辞颈诲アフ?リ开発
Shinobu Okano
?
搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门
搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门
搁别补肠迟.箩蝉でクライアントサイドな奥别产アプリ入门
spring_raining
?
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
?
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライ
Masanobu Sato
?

Recently uploaded (7)

論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
?
鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介
鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介
鲍-22プログラミング?コンテスト提出资料「作品説明动画」制作のポイントをご绍介
鲍-22プログラミング?コンテスト运営事务局
?
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
sugiuralab
?
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
翔栄 杉田
?
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
info819904
?
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージカスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
info819904
?
【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)
【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)
【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)
Sojitz Tech-Innovation USA
?
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
?
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
自由に移动する复数の?々に异なる映像を提?するテ?ィスフ?レイシステムについての基础検讨
sugiuralab
?
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
2019飞冲东京大学大学院茂木研究室冲学生研究员杉田翔栄冲搁罢贰最终発表会スライト?.辫诲蹿
翔栄 杉田
?
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
量子リザバソフトウェア冲时系列データ(农业?核融合?需要予测)効果検証冲导入による成果
info819904
?
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージカスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
カスタム厂尝惭「贬补尘蝉迟别谤」冲軽量でセキュアな専用言语モデル冲础滨エージェント冲チャットボット冲マッチングアプリ构筑のコアパッケージ
info819904
?
【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)
【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)
【STech I USA】2025.3.21 MWC 2025フィードバック ~通信が作る未来のトレンド~(2025.3.21)
Sojitz Tech-Innovation USA
?

Rx java x retrofit

  • 2. 自己紹介 ? Shun Nakahara ? 27 ? iOS/Android ? iOS 大好きです! ? @shun_nakahara
  • 9. RxJava + Retrofit ? RxJava を簡単に紹介 ? Retro?t を簡単に紹介 ? 二つを合わせたテクニックを紹介
  • 11. RxJava ? Reactive Extensions Java ? リアクティブプログラミングをするためのライブラリ ? 同期処理、非同期処理、遅延実行…
  • 13. Gradle の準備 // RxJava? compile 'io.reactivex:rxjava:1.0.15'
  • 14. 基本的な書き方 String name = “shun"; ? Subscription subscription = Observable.from(new String[]{name}).subscribe(new Action1<String>() {? @Override? public void call(String string) {? String name = "nakahara " + string;? System.out.print(name);? }? }); ? subscription.unsubscribe();
  • 15. 基本的な処理を便利に!? Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {? @Override? public void call(Subscriber<? super String> subscriber) {? final String name = "shun"; // 重い処理などをここで行う。? String fullName = "nakahara " + name;? ? subscriber.onNext(fullName);? subscriber.onCompleted();? }? }; ? Subscription subscription = Observable.create(onSubscribe).subscribe(new Action1<String>() {? @Override? public void call(String string) {? System.out.print(string);? }? }); ? subscription.unsubscribe();
  • 16. 非同期処理 Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {? @Override? public void call(Subscriber<? super String> subscriber) {? ? // 通信処理? ? boolean isSuccess = false;? String response = "response";? if (isSuccess) {? subscriber.onNext(response);? subscriber.onCompleted();? } else {? subscriber.onError(new NetworkErrorException("connect error"));? }? }? };? Observable<String> stringObservable = Observable.create(onSubscribe);? stringObservable.subscribe(new Observer<String>() {? @Override? public void onCompleted() {? // network completed? }? ? @Override? public void onError(Throwable e) {? // network error message? }? ? @Override? public void onNext(String string) {? // network success response? }? });
  • 17. 同期処理を書きたい時 Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {? @Override? public void call(Subscriber<? super String> subscriber) {? ? // 通信処理? ? boolean isSuccess = false;? String response = "response";? if (isSuccess) {? subscriber.onNext(response);? subscriber.onCompleted();? } else {? subscriber.onError(new NetworkErrorException("connect error"));? }? }? };? ? Observable<String> stringObservable = Observable.create(onSubscribe);? ? String response = stringObservable.toBlocking().single();? if (response == null) {? // error? } else {? // success? }
  • 19. メソッドに切す public Observable<String> request() {? Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {? @Override? public void call(Subscriber<? super String> subscriber) {? ? // 通信処理? ? boolean isSuccess = false;? String response = "response";? if (isSuccess) {? subscriber.onNext(response);? subscriber.onCompleted();? } else {? subscriber.onError(new NetworkErrorException("connect error"));? }? }? };? return Observable.create(onSubscribe);? }
  • 20. 非同期処理 request().subscribe(new Observer<String>() {? @Override? public void onCompleted() {? // network completed? }? ? @Override? public void onError(Throwable e) {? // network error? }? ? @Override? public void onNext(String s) {? // response call back? }? });
  • 21. 同期処理 String response = request().toBlocking().single();? if (response == null) {? // network error? } else {? // response call back? }
  • 23. RxAndroid ? Reactive Extensions Android ? リアクティブプログラミングをするためのライブラリ ? 同期処理、非同期処理、遅延実行… ? RxJavaを内包しAndroidで利用するための機能を追加 ? Android Handler / Thread 処理
  • 24. RxAndroid…他にも ? RxLifecycle ? RxBinding ? SqlBrite ? Android-ReactiveLocation ? rx-preferences
  • 26. Gradle の準備 // RxJava? compile 'io.reactivex:rxjava:1.0.15'? ? // RXAndroid? compile 'io.reactivex:rxandroid:1.0.1'
  • 27. Android Schedulers request().subscribeOn(Schedulers.newThread())? .observeOn(AndroidSchedulers.mainThread())? .subscribe(new Observer<String>() {? @Override? public void onCompleted() {? // network completed // main thread? }? ? @Override? public void onError(Throwable e) {? // network error? // main thread? }? ? @Override? public void onNext(String s) {? // response call back? // main thread? }? });
  • 28. Handler Schedulers Handler handler = new Handler();? request().subscribeOn(Schedulers.newThread())? .observeOn(HandlerScheduler.from(handler))? .subscribe(new Observer<String>() {? @Override? public void onCompleted() {? // network completed? // handler thread? }? ? @Override? public void onError(Throwable e) {? // network error? // handler thread? }? ? @Override? public void onNext(String s) {? // response call back? // handler thread? }? });
  • 31. Retrofit ? A Type safe HTTP client for Android and Java ? Android の為の REST 通信を手軽に実装できる!? ? Retro?t 2.0.0-bata2 を利用します。
  • 32. Retrofit ? 基本的な使い方 ? 非同期処理 ? 同期処理 ? RxJava を組み込んでみる
  • 33. Gradle の準備 // Retrofit? compile ‘com.squareup.retrofit:retrofit:2.0.0-beta2' // gson? compile ‘com.google.code.gson:gson:2.4' // Converter Gson? compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'?
  • 34. Proguard の準備 # Retrofit Proguard? -dontwarn retrofit.**? -keep class retrofit.** { *; }? -keepattributes Signature? -keepattributes Exceptions
  • 36. Model Class の作成 public class SignIn {? @SerializedName("access_token")? public final String accessToken;? ? @SerializedName("user_id")? public final int userId;? ? @SerializedName("group_id")? public final int group_id;? ? public SignIn(String accessToken, int userId, int group_id) {? this.accessToken = accessToken;? this.userId = userId;? this.group_id = group_id;? }? }
  • 37. Service Interface 作成 public interface UsersService {? @FormUrlEncoded? @POST("/v3/users/sign_in")? Call<SignIn> signIn(@Field("email") String email, @Field("password") String password);? }
  • 38. Service Interface 作成 public interface UsersService {? @FormUrlEncoded? @POST("/v3/users/sign_in")? Call<SignIn> signIn(@Field("email") String email, @Field("password") String password);? }
  • 39. 非同期処理 // Gson Converter Factory? GsonConverterFactory factory = GsonConverterFactory.create(new Gson());? ? // Retrofit? Retrofit retrofit = new Retrofit.Builder()? .baseUrl(baseUrl)? .addConverterFactory(factory)? .build();? ? // Users Service? UsersService usersService = retrofit.create(UsersService.class);? ? // Call? Call<SignIn> call = usersService.signIn(Email, Password);? call.enqueue(new Callback<SignIn>() {? @Override? public void onResponse(Response<SignIn> response, Retrofit retrofit) {? // network success? }? ? @Override? public void onFailure(Throwable t) {? // network error? }? });
  • 40. 同期処理 // Gson Converter Factory? GsonConverterFactory factory = GsonConverterFactory.create(new Gson());? ? // Retrofit? Retrofit retrofit = new Retrofit.Builder()? .baseUrl(baseUrl)? .addConverterFactory(factory)? .build();? ? // Users Service? UsersService usersService = retrofit.create(UsersService.class);? ? // Call? Call<SignIn> call = usersService.signIn(Email, Password);? try {? Response<SignIn> response = call.execute();? } catch (IOException e) {? e.printStackTrace();? }
  • 41. ???
  • 44. Service Interface(RxJava版) public interface UsersService {? @FormUrlEncoded? @POST("/v3/users/sign_in")? Observable<SignIn> signIn(@Field("email") String email, @Field("password") String password);? }?
  • 45. 非同期処理(RxJava版) // Gson Converter Factory? GsonConverterFactory factory = GsonConverterFactory.create(new Gson());? ? // RxJava Call Adapter? RxJavaCallAdapterFactory adapterFactory = RxJavaCallAdapterFactory.create();? ? // Retrofit? Retrofit retrofit = new Retrofit.Builder()? .baseUrl(baseUrl)? .addConverterFactory(factory)? .addCallAdapterFactory(adapterFactory)? .build();? ? // Users Service? UsersService usersService = retrofit.create(UsersService.class);? ? // User Service? Observable<SignIn> observable = usersService.signIn(Email, Password);? observable.subscribeOn(Schedulers.newThread())? .observeOn(AndroidSchedulers.mainThread())? .subscribe(new Observer<SignIn>() {? @Override? public void onCompleted() {? // network completed? }? ? @Override? public void onError(Throwable e) {? // network error? }? ? @Override? public void onNext(SignIn signIn) {? // network success? }? });
  • 46. 同期処理(RxJava版) // Gson Converter Factory? GsonConverterFactory factory = GsonConverterFactory.create(new Gson());? ? // RxJava Call Adapter? RxJavaCallAdapterFactory adapterFactory = RxJavaCallAdapterFactory.create();? ? // Retrofit? Retrofit retrofit = new Retrofit.Builder()? .baseUrl(baseUrl)? .addConverterFactory(factory)? .addCallAdapterFactory(adapterFactory)? .build();? ? // Users Service? UsersService usersService = retrofit.create(UsersService.class);? ? // Call? Observable<SignIn> observable = usersService.signIn(Email, Password);? SignIn signIn = observable? .subscribeOn(Schedulers.newThread())? .toBlocking()? .single();? ? if (signIn == null) {? // network error? } else {? // network success? }
  • 48. Retrofit でハマったこと ? Twitter Kit では Retro?t 1.8 を使っている ? Retro?t 1.8-1.9 と Retro?t 2.0 で設定の変更 ? Retro?t 2.0 では、RxJava の Call Adapter が必要