49
2015.11.27 オープンソースライブラリ研究会 Android Shun Nakahara

Rx java x retrofit

Embed Size (px)

Citation preview

Page 1: Rx java x retrofit

2015.11.27

オープンソースライブラリ研究会 Android編Shun Nakahara

Page 2: Rx java x retrofit

自己紹介

✤ Shun Nakahara

✤ 27

✤ iOS/Android

✤ iOS 大好きです!

✤ @shun_nakahara

Page 3: Rx java x retrofit

全員エンジニア合コンをやってみた人生初の合コン

Page 4: Rx java x retrofit

FiNC 紹介

Page 5: Rx java x retrofit

一生に一度のかけがえのない人生の成功をサポートする

Page 6: Rx java x retrofit

iOS 大好きです!!

Page 7: Rx java x retrofit

iOS で発表したかったんですが…

Page 8: Rx java x retrofit

RxJava + Retrofit

Page 9: Rx java x retrofit

RxJava + Retrofit

✤ RxJava を簡単に紹介

✤ Retrofit を簡単に紹介

✤ 二つを合わせたテクニックを紹介

Page 10: Rx java x retrofit

RxJava

Page 11: Rx java x retrofit

RxJava

✤ Reactive Extensions Java

✤ リアクティブプログラミングをするためのライブラリ

✤ 同期処理、非同期処理、遅延実行…

Page 12: Rx java x retrofit

RxJava

✤ 基本的な使い方

✤ 非同期処理

✤ 同期処理

✤ RxAndroid

Page 13: Rx java x retrofit

Gradle の準備

// RxJavacompile 'io.reactivex:rxjava:1.0.15'

Page 14: Rx java x retrofit

基本的な書き方

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();

Page 15: Rx java x retrofit

基本的な処理を便利に!?

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();

Page 16: Rx java x retrofit

非同期処理

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 } });

Page 17: Rx java x retrofit

同期処理を書きたい時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}

Page 18: Rx java x retrofit

気づいた人いますか?

Page 19: Rx java x retrofit

メソッドに切す

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); }

Page 20: Rx java x retrofit

非同期処理

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 } });

Page 21: Rx java x retrofit

同期処理

String response = request().toBlocking().single(); if (response == null) { // network error} else { // response call back}

Page 22: Rx java x retrofit

なんだかこれだと使えそうな 気がしますね!d(‾ ‾)

Page 23: Rx java x retrofit

RxAndroid

✤ Reactive Extensions Android

✤ リアクティブプログラミングをするためのライブラリ

✤ 同期処理、非同期処理、遅延実行…

✤ RxJavaを内包しAndroidで利用するための機能を追加

✤ Android Handler / Thread 処理

Page 24: Rx java x retrofit

RxAndroid…他にも

✤ RxLifecycle

✤ RxBinding

✤ SqlBrite

✤ Android-ReactiveLocation

✤ rx-preferences

Page 25: Rx java x retrofit

RxAndroid

✤ AndroidSchedulers

✤ HandlerSchedulers

Page 26: Rx java x retrofit

Gradle の準備

// RxJavacompile 'io.reactivex:rxjava:1.0.15'// RXAndroidcompile 'io.reactivex:rxandroid:1.0.1'

Page 27: Rx java x retrofit

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 } });

Page 28: Rx java x retrofit

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 } });

Page 29: Rx java x retrofit

RxJava わかってきたところで

Page 30: Rx java x retrofit

Retrofit

Page 31: Rx java x retrofit

Retrofit

✤ A Type safe HTTP client for Android and Java

✤ Android の為の REST 通信を手軽に実装できる!?

✤ Retrofit 2.0.0-bata2 を利用します。

Page 32: Rx java x retrofit

Retrofit

✤ 基本的な使い方

✤ 非同期処理

✤ 同期処理

✤ RxJava を組み込んでみる

Page 33: Rx java x retrofit

Gradle の準備

// Retrofitcompile ‘com.squareup.retrofit:retrofit:2.0.0-beta2'

// gsoncompile ‘com.google.code.gson:gson:2.4'

// Converter Gsoncompile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

Page 34: Rx java x retrofit

Proguard の準備

# Retrofit Proguard-dontwarn retrofit.**-keep class retrofit.** { *; } -keepattributes Signature-keepattributes Exceptions

Page 35: Rx java x retrofit

基本的な使い方

Page 36: Rx java x retrofit

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; } }

Page 37: Rx java x retrofit

Service Interface 作成

public interface UsersService { @FormUrlEncoded @POST("/v3/users/sign_in") Call<SignIn> signIn(@Field("email") String email, @Field("password") String password); }

Page 38: Rx java x retrofit

Service Interface 作成

public interface UsersService { @FormUrlEncoded @POST("/v3/users/sign_in") Call<SignIn> signIn(@Field("email") String email, @Field("password") String password); }

Page 39: Rx java x retrofit

非同期処理

// Gson Converter FactoryGsonConverterFactory factory = GsonConverterFactory.create(new Gson()); // RetrofitRetrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(factory) .build(); // Users ServiceUsersService usersService = retrofit.create(UsersService.class); // CallCall<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 } });

Page 40: Rx java x retrofit

同期処理

// Gson Converter FactoryGsonConverterFactory factory = GsonConverterFactory.create(new Gson()); // RetrofitRetrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(factory) .build(); // Users ServiceUsersService usersService = retrofit.create(UsersService.class); // CallCall<SignIn> call = usersService.signIn(Email, Password); try { Response<SignIn> response = call.execute(); } catch (IOException e) { e.printStackTrace(); }

Page 41: Rx java x retrofit

・・・

Page 42: Rx java x retrofit

クラッシュ

Page 43: Rx java x retrofit

RxJava + Retrofit

Page 44: Rx java x retrofit

Service Interface(RxJava版)

public interface UsersService { @FormUrlEncoded @POST("/v3/users/sign_in") Observable<SignIn> signIn(@Field("email") String email, @Field("password") String password); }

Page 45: Rx java x retrofit

非同期処理(RxJava版)

// Gson Converter FactoryGsonConverterFactory factory = GsonConverterFactory.create(new Gson()); // RxJava Call AdapterRxJavaCallAdapterFactory adapterFactory = RxJavaCallAdapterFactory.create();// RetrofitRetrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(factory) .addCallAdapterFactory(adapterFactory) .build(); // Users ServiceUsersService usersService = retrofit.create(UsersService.class); // User ServiceObservable<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 } });

Page 46: Rx java x retrofit

同期処理(RxJava版)

// Gson Converter FactoryGsonConverterFactory factory = GsonConverterFactory.create(new Gson()); // RxJava Call AdapterRxJavaCallAdapterFactory adapterFactory = RxJavaCallAdapterFactory.create(); // RetrofitRetrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(factory) .addCallAdapterFactory(adapterFactory) .build(); // Users ServiceUsersService usersService = retrofit.create(UsersService.class); // CallObservable<SignIn> observable = usersService.signIn(Email, Password); SignIn signIn = observable .subscribeOn(Schedulers.newThread()) .toBlocking() .single(); if (signIn == null) { // network error} else { // network success}

Page 47: Rx java x retrofit

Retrofit でハマったこと

Page 48: Rx java x retrofit

Retrofit でハマったこと

✤ Twitter Kit では Retrofit 1.8 を使っている

✤ Retrofit 1.8-1.9 と Retrofit 2.0 で設定の変更

✤ Retrofit 2.0 では、RxJava の Call Adapter が必要

Page 49: Rx java x retrofit

ありがとうございました。