kotlinのメモです。
1500 views
以下に、サンプルコードを簡潔でわかりやすい形に改善し、各関数の説明を追加しました。
このサンプルコードは、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が破棄されたら購読も解除
}
}
onCreate
メソッド:
runRxJavaExamples
メソッドを呼び出して複数のRxKotlinの例を実行します。simpleObservableExample
メソッド:
Observable
を作成し、要素を順番に出力します。.subscribe
メソッドで受け取った値をLog
に表示します。filterAndMapExample
メソッド:
Flowable
を使って、数値のリストから5以上のものだけをフィルタし、さらに10倍にして出力します。filter
とmap
を組み合わせることで、データを効率的に操作できます。asyncProcessingExample
メソッド:
Single.fromCallable
を使って、重い処理を別スレッドで非同期に実行します。.subscribeOn(Schedulers.io())
で非同期処理が別スレッドで実行され、.observeOn(AndroidSchedulers.mainThread())
で結果をメインスレッドに受け渡します。onSuccess
で結果を受け取り、onError
でエラーが発生した場合の処理を記述しています。errorHandlingExample
メソッド:
Single.fromCallable
で処理を定義し、エラーが発生した場合はonError
でキャッチして表示します。performHeavyTask
メソッド:
throwErrorTask
メソッド:
CompositeDisposable
の利用:
addTo(disposables)
を使って購読を管理し、onDestroy
で購読を解除します。これにより、Activityが破棄されたときにメモリリークを防ぐことができます。fromCallable
に似たメソッドとしてfromAction
がありますが、これらの違いはしばしば混乱されます。以下の情報を参考にしてください。
fromCallable
は何かしらの結果を返す処理に、fromAction
は結果を返さないが、何かを実行するだけの処理(例えば、ログ書き込みやファイル削除など)に適しています。
詳細な違いについては、以下のリンク先を参考にしてください。
Difference between Completable.fromAction
and Completable.fromCallable
このサンプルコードでは、RxKotlinを使って基本的な非同期処理の例を示しました。Schedulers
やSingle
、CompositeDisposable
などを使い、スレッドの切り替えや購読の解除を管理する方法を紹介しました。また、fromCallable
とfromAction
の違いを理解することで、用途に合った非同期処理の実装が可能です。
Page 19 of 36.
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/