22時に寝ようと思って2時に寝る。

備忘録や日記を書いてます。きょうは早く寝よう。

RxJava - IntelliJ IDEA で RxJava の環境構築

実際に RxJava のサンプルコードを書いていく上での環境を構築していきます。今回はエディタとして IntelliJ IDEA を用います。

www.jetbrains.com

動作確認環境

  • OS: macOS High Sierra 10.13.6
  • IntelliJ IDEA: 2018.2.1 (Ultimate Edition) Build #IU-182.3911.36
  • JRE: 1.8.0_152-release-1248-b8 x86_64
  • JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

環境構築

今回導入する RxJava のバージョンは記事執筆時点で最新の 2.2.0 です。

Release 2.2.0 · ReactiveX/RxJava · GitHub

IntelliJ IDEA で新たにプロジェクトを作成する

  • 起動後の Welcome to IntelliJ IDEA 画面にて、+ Create New Projectを選択

f:id:azuuun:20180818223403p:plain

  • サイドメニューから Gradle を選び、Next で次へ

f:id:azuuun:20180818223330p:plain

  • Project SDKについて聞かれた場合は IntelliJ IDEA 側でよしなにやってくれていると思いますので、そのとおり進めてください
  • GroupId, ArtifactId, Versionについて
    • https://improve-future.com/what-are-groupid-artifactid.html でわかりやすく説明されています
    • GroupId はプロジェクトを一意に識別できるもので com.example.azuuun.rxjava といったフォーマットで入力
    • ArtifactId は任意のプロジェクト名 RxJavaPlayground といったものを入力
    • Version はデフォルトでよいと思います
  • 次の画面の module の設定画面はデフォルトで進めて問題ないです
  • ProjectName などは先程設定した ArtifactId がデフォルトで設定されていますが、適当に名前を入力します

Gradle でライブラリを適用する

f:id:azuuun:20180818224704p:plain

  • プロジェクトが作成された後、build.gradle ファイルを開きます
  • dependenciescompile 'io.reactivex.rxjava2:rxjava:2.2.0'追記
  • ファイル右上に Enabled Auto-Import といった表示があればクリックします
  • 正常に導入されるかを確認

サンプルコードを書いてみる

HelloRxJavaというファイルを作成し、以下のコードを書いて実行してみましょう。

import io.reactivex.*;
import io.reactivex.schedulers.Schedulers;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;

public class HelloRxJava {
    public static void main(String[] args) throws Exception {

        Flowable<String> flowable =
                Flowable.create(new FlowableOnSubscribe<String>() {
                    @Override
                    public void subscribe(FlowableEmitter<String> emitter) throws Exception {
                        String[] datas = { "Hello, RxJava", "こんにちは、RxJava" };
                        for (String data : datas) {
                            if (emitter.isCancelled()) {
                                return;
                            }

                            // データを通知する
                            emitter.onNext(data);
                        }

                        // 完了したことを通知する
                        emitter.onComplete();
                    }
                }, BackpressureStrategy.BUFFER);

        flowable.observeOn(Schedulers.computation())
                .subscribe(new Subscriber<String>() {

                    private Subscription subscription;

                    // 購読を開始したときの処理
                    @Override
                    public void onSubscribe(Subscription s) {
                        // Subscription を Subscriber 内で保持
                        this.subscription = s;
                        // 受け取るデータ数の要求
                        this.subscription.request(1L);
                    }

                    // 通知を受け取ったときの処理
                    @Override
                    public void onNext(String data) {
                        String threadName = Thread.currentThread().getName();
                        System.out.println(String.format("%s: %s", threadName, data));

                        // 次に受け取るデータのリクエスト
                        this.subscription.request(1L);
                    }

                    // エラー通知を受け取ったときの処理
                    @Override
                    public void onError(Throwable t) {
                        t.printStackTrace();
                    }

                    // 完了通知を受け取ったときの処理
                    @Override
                    public void onComplete() {
                        String threadName = Thread.currentThread().getName();
                        System.out.println(String.format("%s: 完了しました", threadName));
                    }
                });

        Thread.sleep(500L);
    }
}

以下のような出力が出れば、環境は正常に構築できています。

RxComputationThreadPool-1: Hello, RxJava
RxComputationThreadPool-1: こんにちは、RxJava
RxComputationThreadPool-1: 完了しました

以上です。

次の記事

azunobu.hatenablog.com

参考

RxJavaリアクティブプログラミング (CodeZine BOOKS)

RxJavaリアクティブプログラミング (CodeZine BOOKS)