Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

いきなりRxAndroid

RxAndroidを使う機会があったので,調べたことをまとめました.
※理解が浅いので間違っている箇所はご指摘いただけると嬉しいです><

RxAndroidとは

Reactive Extentions Androidの略で,RxJavaを内包しAndroidで利用するための機能を追加してあります.

ソースコードはこちらです.

github.com

非同期処理が簡単に実装できます.
AsyncTaskに比べ実装が簡単で,ModelとViewで役割分担しやすいです.

使い方

Observavle:処理を実行しObserverに結果を伝える
Observer:Observavleから結果を受け取り処理する

build.gradle

compile 'io.reactivex:rxjava:1.1.5'
compile 'io.reactivex:rxandroid:1.2.0'

MainActivity.java

package himitsu;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.schedulers.Schedulers;
import rx.android.schedulers.AndroidSchedulers;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observable
            .create(new Observable.OnSubscribe<Integer>() {
                @Override
                public void call(Subscriber<? super Integer> subscriber) {
                    // 重い処理
                    int i = 0;
                    Log.d("debug", "Observable:onNext1");
                    subscriber.onNext(i);
                    Log.d("debug", "Observable:onNext2");
                    Log.d("debug", "Observable:onCompleted1");
                    subscriber.onCompleted();
                    Log.d("debug", "Observable:onCompleted2");
                }
            })
            .subscribeOn(Schedulers.newThread()) // どのスレッドでObservableを走らせるか
            .observeOn(AndroidSchedulers.mainThread()) // どのスレッドでObserverを走らせるか
            .subscribe(new Observer<Integer>() { // Observable.subscribe(observer)すると処理が始まる
                @Override
                public void onCompleted() {
                    Log.d("debug", "Observer::onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    Log.d("debug", "Observer::onError");
                }

                @Override
                public void onNext(Integer i) {
                    Log.d("debug", "Observer::onNext");
                }
        });
    }
}

Android Monitor

debug: Observable:onNext1
debug: Observable:onNext2
debug: Observable:onCompleted1
debug: Observable:onCompleted2
debug: Observer::onNext
debug: Observer::onCompleted

参考

kirimin.hatenablog.com
使い方やメソッドを丁寧に解説されていて,初心者の私にも分かりやすかったです.

qiita.com
AsyncTaskとの比較が簡潔に記されていました.