SlideShare 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 を簡単に紹介
✤ Retrofit を簡単に紹介
✤ 二つを合わせたテクニックを紹介
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 通信を手軽に実装できる!?
✤ Retrofit 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 では Retrofit 1.8 を使っている
✤ Retrofit 1.8-1.9 と Retrofit 2.0 で設定の変更
✤ Retrofit 2.0 では、RxJava の Call Adapter が必要
ありがとうございました。

More Related Content

PPTX
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
PDF
Reactive Extensionsで非同期処理を簡単に
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
async/await のしくみ
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
PDF
LINQ in Unity
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Reactive Extensionsで非同期処理を簡単に
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
async/await のしくみ
C#次世代非同期処理概観 - Task vs Reactive Extensions
LINQ in Unity
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方

What's hot (20)

PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async)
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PDF
Reactive Extensions v2.0
PDF
linq.js - Linq to Objects for JavaScript
PDF
Go conference 2017 Lightning talk
PDF
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
PDF
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
PDF
Async design with Unity3D
KEY
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
PPTX
Rxに入門しようとしている
PDF
Shibuya JVM Groovy 20150418
PDF
An Internal of LINQ to Objects
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PDF
ZynqMPのQEMU
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
PDF
Hello Dark-Side C# (Part. 1)
PPTX
C# 8.0 非同期ストリーム
Deep Dive async/await in Unity with UniTask(UniRx.Async)
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Reactive Extensions v2.0
linq.js - Linq to Objects for JavaScript
Go conference 2017 Lightning talk
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Async design with Unity3D
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Rxに入門しようとしている
Shibuya JVM Groovy 20150418
An Internal of LINQ to Objects
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
ZynqMPのQEMU
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
LINQ 概要 + 結構便利な LINQ to XML
Synthesijer and Synthesijer.Scala in HLS-friends 201512
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Hello Dark-Side C# (Part. 1)
C# 8.0 非同期ストリーム
Ad

Viewers also liked (13)

PDF
RxJava + Retrofit
PDF
Dagger & rxjava & retrofit
PDF
Retrofit Android by Chris Ollenburg
PDF
Retrofit
PDF
Practical RxJava for Android
PPTX
Introduction to rx java for android
PDF
Introduction to Retrofit and RxJava
PDF
Realm: Building a mobile database
PPTX
Reactive Programming on Android - RxAndroid - RxJava
PDF
Customizing Theme and Style for Material Design : Droid Kaigi 2016
PDF
全てSになる -RxJavaとLWSを持ち込む楽しさ-
PPTX
Retrofitting
PDF
Designing Teams for Emerging Challenges
RxJava + Retrofit
Dagger & rxjava & retrofit
Retrofit Android by Chris Ollenburg
Retrofit
Practical RxJava for Android
Introduction to rx java for android
Introduction to Retrofit and RxJava
Realm: Building a mobile database
Reactive Programming on Android - RxAndroid - RxJava
Customizing Theme and Style for Material Design : Droid Kaigi 2016
全てSになる -RxJavaとLWSを持ち込む楽しさ-
Retrofitting
Designing Teams for Emerging Challenges
Ad

Similar to Rx java x retrofit (20)

PDF
RxJava on Android
PDF
Android meets RxJava - 渋谷Java#6
PPTX
【Potatotips #30】RxJavaを活用する3つのユースケース
PPTX
歌舞伎座Tech Rx会
PDF
Composable Callbacks & Listeners
PDF
Androidの通信周りのコーディングについて
PDF
Xamarin で ReactiveUI を使ってみた
PDF
Android + JSON-RPC
PPTX
学生向けAndroid勉強会(入門編)
KEY
Actor&stm
PDF
Clean Architectureで設計してRxJSを使った話
PDF
2015 07-23 Tokyo Realm Meetup
PPTX
Reactive
PDF
Observableで非同期処理
PDF
Sansan様 登壇資料
PDF
Paging Libraryの利用をやめたいお気持ち表明
PDF
サーバーサイドでの非同期処理で色々やったよ
PPTX
Androidアプリケーション応用 WebAPI開発
PDF
ScalaでAndroidアプリ開発
PDF
Androidの非同期
RxJava on Android
Android meets RxJava - 渋谷Java#6
【Potatotips #30】RxJavaを活用する3つのユースケース
歌舞伎座Tech Rx会
Composable Callbacks & Listeners
Androidの通信周りのコーディングについて
Xamarin で ReactiveUI を使ってみた
Android + JSON-RPC
学生向けAndroid勉強会(入門編)
Actor&stm
Clean Architectureで設計してRxJSを使った話
2015 07-23 Tokyo Realm Meetup
Reactive
Observableで非同期処理
Sansan様 登壇資料
Paging Libraryの利用をやめたいお気持ち表明
サーバーサイドでの非同期処理で色々やったよ
Androidアプリケーション応用 WebAPI開発
ScalaでAndroidアプリ開発
Androidの非同期

Rx java x retrofit

  • 2. 自己紹介 ✤ Shun Nakahara ✤ 27 ✤ iOS/Android ✤ iOS 大好きです! ✤ @shun_nakahara
  • 9. RxJava + Retrofit ✤ RxJava を簡単に紹介 ✤ Retrofit を簡単に紹介 ✤ 二つを合わせたテクニックを紹介
  • 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 通信を手軽に実装できる!? ✤ Retrofit 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();
 }
  • 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 では Retrofit 1.8 を使っている ✤ Retrofit 1.8-1.9 と Retrofit 2.0 で設定の変更 ✤ Retrofit 2.0 では、RxJava の Call Adapter が必要