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);
(6) アプリ開始
実行すると下記画面が表示されます。
(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); // 追加 } }); }