初心者用kotlin

kotlinのメモです。

1500 views

以下に、サンプルコードを簡潔でわかりやすい形に改善し、各関数の説明を追加しました。


RxKotlin サンプル

コード全体の流れ

このサンプルコードは、RxKotlinを用いて非同期処理やストリーム操作を学ぶための例を提供しています。ボタンをクリックすると、いくつかの非同期処理が実行され、それぞれの結果がログに表示されます。

package com.konishisoft.myapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.Toast
import io.reactivex.Flowable
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.addTo
import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.rxkotlin.toObservable
import io.reactivex.schedulers.Schedulers

class MainActivity : AppCompatActivity() {

    private val disposables = CompositeDisposable()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btn = findViewById<Button>(R.id.button)
        btn.setOnClickListener {
            runRxJavaExamples()
            Toast.makeText(this, "クリックされました", Toast.LENGTH_LONG).show()
        }
    }

    // 例として各関数をまとめて呼び出す
    private fun runRxJavaExamples() {
        simpleObservableExample()
        filterAndMapExample()
        asyncProcessingExample()
        errorHandlingExample()
    }

    // リストの要素を順に表示するシンプルな例
    private fun simpleObservableExample() {
        val list = listOf(1, 2, 3)
        list.toObservable()
            .subscribe { item ->
                Log.d("SimpleExample", "Received: $item")
            }.addTo(disposables)
    }

    // 5以上の値を10倍にして出力する例
    private fun filterAndMapExample() {
        Flowable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
            .filter { it >= 5 }  // 5以上の値だけを通す
            .map { it * 10 }     // 10倍に変換
            .subscribe { result ->
                Log.d("FilterMapExample", "Processed: $result")
            }.addTo(disposables)
    }

    // 非同期に別スレッドで処理を実行する例
    private fun asyncProcessingExample() {
        Single.fromCallable { performHeavyTask() }
            .subscribeOn(Schedulers.io())           // 別スレッドで実行
            .observeOn(AndroidSchedulers.mainThread()) // メインスレッドで結果を受け取る
            .subscribeBy(
                onSuccess = { result ->
                    Log.d("AsyncExample", "Result: $result")
                },
                onError = { error ->
                    Log.e("AsyncExample", "Error: ${error.message}")
                }
            ).addTo(disposables)
    }

    // エラーを扱う例
    private fun errorHandlingExample() {
        Single.fromCallable { throwErrorTask() }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(
                onSuccess = { result ->
                    Log.d("ErrorExample", "Result: $result")
                },
                onError = { error ->
                    Log.e("ErrorExample", "Caught Error: ${error.message}")
                }
            ).addTo(disposables)
    }

    // 重いタスクのシミュレーション
    private fun performHeavyTask(): String {
        Thread.sleep(2000) // 処理に時間がかかるようにする
        return "タスク完了"
    }

    // エラーを発生させるタスクのシミュレーション
    private fun throwErrorTask(): String {
        throw Exception("エラーが発生しました")
    }

    override fun onDestroy() {
        super.onDestroy()
        disposables.clear() // Activityが破棄されたら購読も解除
    }
}

解説

  1. onCreateメソッド:

    • ボタンがクリックされたときに、runRxJavaExamplesメソッドを呼び出して複数のRxKotlinの例を実行します。
  2. simpleObservableExampleメソッド:

    • リストからObservableを作成し、要素を順番に出力します。
    • .subscribeメソッドで受け取った値をLogに表示します。
  3. filterAndMapExampleメソッド:

    • Flowableを使って、数値のリストから5以上のものだけをフィルタし、さらに10倍にして出力します。
    • filtermapを組み合わせることで、データを効率的に操作できます。
  4. asyncProcessingExampleメソッド:

    • Single.fromCallableを使って、重い処理を別スレッドで非同期に実行します。
    • .subscribeOn(Schedulers.io())で非同期処理が別スレッドで実行され、.observeOn(AndroidSchedulers.mainThread())で結果をメインスレッドに受け渡します。
    • onSuccessで結果を受け取り、onErrorでエラーが発生した場合の処理を記述しています。
  5. errorHandlingExampleメソッド:

    • 例外を発生させるタスクの例です。Single.fromCallableで処理を定義し、エラーが発生した場合はonErrorでキャッチして表示します。
    • これにより、例外が発生したときの処理を簡単に管理できます。
  6. performHeavyTaskメソッド:

    • 2秒の待機時間をシミュレーションした重い処理の例。非同期処理のテストに使用します。
  7. throwErrorTaskメソッド:

    • 処理中に例外を発生させるタスクの例。エラーハンドリングのテストに使用します。
  8. CompositeDisposableの利用:

    • addTo(disposables)を使って購読を管理し、onDestroyで購読を解除します。これにより、Activityが破棄されたときにメモリリークを防ぐことができます。

fromCallable と fromAction の違い

fromCallableに似たメソッドとしてfromActionがありますが、これらの違いはしばしば混乱されます。以下の情報を参考にしてください。

fromCallable

  • 戻り値を持つ処理に使用されます。
  • 処理が成功した場合は、その結果を通知します。失敗した場合はエラーを通知します。

fromAction

  • 戻り値を持たない処理に使用されます。
  • 処理が完了したか、エラーが発生したかの通知だけを行います。

fromCallableは何かしらの結果を返す処理に、fromActionは結果を返さないが、何かを実行するだけの処理(例えば、ログ書き込みやファイル削除など)に適しています。

詳細な違いについては、以下のリンク先を参考にしてください。
Difference between Completable.fromAction and Completable.fromCallable

まとめ

このサンプルコードでは、RxKotlinを使って基本的な非同期処理の例を示しました。SchedulersSingleCompositeDisposableなどを使い、スレッドの切り替えや購読の解除を管理する方法を紹介しました。また、fromCallablefromActionの違いを理解することで、用途に合った非同期処理の実装が可能です。

Page 19 of 36.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626