IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

ReactiveX/RxAndroidのサンプルの入門

(1) プロジェクト作成

Android Studio で新規 プロジェクトをblank activityで作成します。

(2) ライブラリ依存関係の設定

Appディレクトリ配下のbuild.gradleファイルのdependencyのcompileに以下を追加します。

compile 'com.android.support:appcompat-v7:21.0.3'
compile 'io.reactivex:rxandroid:1.1.0'

(3) 文字列定義

下記URLにあるstrings.xmlファイルを上書きでコピーします。

https://github.com/ReactiveX/RxAndroid/blob/master/sample-app/src/main/res/values/strings.xml

(4) レイアウト定義

下記URLにあるmain_activity.xmlファイルの内容を、作成したプロジェクトでデフォルトで作成されているactivity_main.xmlに上書きします。(ファイル名が異なります)

https://github.com/ReactiveX/RxAndroid/blob/master/sample-app/src/main/res/layout/main_activity.xml

(5) アクティビティ実装

下記URLにあるMainActivity.javaファイルのパッケージ宣言以外の内容を、作成したプロジェクトでデフォルトで作成されているMainActivity.javaに上書きします。 コンパイルエラーになるので、layoutの定数を書き換えます。

setContentView(R.layout.main_activity);
↓
setContentView(R.layout.activity_main);

https://github.com/ReactiveX/RxAndroid/blob/master/sample-app/src/main/java/rx/android/samples/MainActivity.java

(6) アプリ開始

実行すると下記画面が表示されます。

f:id:naotoogawa:20160313195154p:plain

(7) 処理実行

Run Schedulers Exampleボタンを押すと、5秒後に下記がログに出ます。

09-23 09:37:28.650 3576-3576/com.example.test13 D/RxAndroidSamples: onNext(one)
09-23 09:37:28.660 3576-3576/com.example.test13 D/RxAndroidSamples: onNext(two)
09-23 09:37:28.660 3576-3576/com.example.test13 D/RxAndroidSamples: onNext(three)
09-23 09:37:28.660 3576-3576/com.example.test13 D/RxAndroidSamples: onNext(four)
09-23 09:37:28.660 3576-3576/com.example.test13 D/RxAndroidSamples: onNext(five)
09-23 09:37:28.660 3576-3576/com.example.test13 D/RxAndroidSamples: onCompleted()

(8) サンプルの変更

(8-1) activity_main.xmlにTextViewを追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <Button
        android:id="@+id/button_run_scheduler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_run_scheduler"/>

    <!-- 下記を追加 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal" />


</LinearLayout>

(8-2) Subscriberに処理追加

MainActivityにTextViewのテキストを更新する処理を記載します。

public class MainActivity extends Activity {
    private static final String TAG = "RxAndroidSamples";

    private Handler backgroundHandler;

    private TextView textView; // 追加

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        textView = (TextView)findViewById(R.id.textView); // 追加

        BackgroundThread backgroundThread = new BackgroundThread();
        backgroundThread.start();
        backgroundHandler = new Handler(backgroundThread.getLooper());

        findViewById(R.id.button_run_scheduler).setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                onRunSchedulerExampleButtonClicked();
            }
        });
    }

    void onRunSchedulerExampleButtonClicked() {
        sampleObservable()
        // Run on a background thread
        .subscribeOn(HandlerScheduler.from(backgroundHandler))
        // Be notified on the main thread
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<String>() {
            @Override public void onCompleted() {
                Log.d(TAG, "onCompleted()");
                textView.setText(textView.getText() + ", " + "onCompleted()"); // 追加

            }

            @Override public void onError(Throwable e) {
                Log.e(TAG, "onError()", e);
            }

            @Override public void onNext(String string) {
                Log.d(TAG, "onNext(" + string + ")");

                textView.setText(textView.getText() + ", " + string); // 追加

            }
        });
    }