前回、やっと(恐らく)Roomをインストールする事が出来た。早速テストしてみよう。

いや、おかしいだろ

まじかよ、まだ駄目だったのかよ。

しかし、今回はインストールエラーという訳では無さそうだ。恐らくメインスレッド内ではアクセス出来ないのだろう・・・

スレッド:2本道

Androidアプリ(と言うか殆どのプログラミング言語)にはスレッドという概念がある。

基本的にプログラムは上から順番に1つずつ実行されてゆく。

こんな感じのプログラムがあった場合、当然処理はA→B→C→Dの順に行われてゆく事になる。しかし、今回のプログラムではそれだと問題が発生してしまう。Roomはデータベースに関する処理を実行しているため、とてつもなく処理が重いのだ。そんな重い処理をセットした場合、そこで処理が停滞してしまう。上図で言うとCの処理が重すぎてDやその後の処理になかなか送達する事が出来ない。といったところか。そのため、今回はまたしてもエラーが発生してしまった。

そこで重要になるのがマルチスレッド、並列処理だ。

上図のように道を2つ以上に分離して「同時に」処理させれば良い。という事である。

ただし!やっている事がやっている事だけに色々な事がいやがおうにも複雑になってしまう。処理が衝突したり合流が上手く行かなかったり・・・ようするにまだまだRoomを使用する事は出来ない。という事だ(テンション下がるわ)

非同期処理:またインストール

そんな訳でまたライブラリのインストールだ。「RxJava」と「Kotlin coroutine」が有名?らしい。知り合いはそう言っていた。

  • RxJava:名前の通り本来はJava用。実は非同期処理専用のライブラリでは無い。
  • Kotlin coroutine:Kotlin用に作られた。非同期処理のためのライブラリらしい。

作者はKotlinメインで開発しているため、今回は「 Kotlin coroutine 」を使用しよう(前汎用ライブラリ使って良くない事になったしな)。

ここからインストールできるらしい・・・

dependencies {
#これを「app.gradle」に追加
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'
}

相変わらず結構な事だ。人の作業を邪魔する以外にやる事は無いのだろうか?

Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1.

つまり、「kotlinx-coroutines」を決定だか特定だか出来ないらしい。そっちがここからインストールしろと言ってきたんだが。

その後、バージョンを1.1.1から1.0.1に変更したらインストールする事が出来た。どういう事なんだよ・・・

#(https://qiita.com/jonghyo/items/bf3e4e06022eebe8e3eb)を参照しました
 def coroutines_version = '1.0.1' //Kotlin coroutines用ライブラリ(async, await)のバージョン
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" //Kotlin coroutines用ライブラリ(async, await)
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" //Kotlin coroutines用ライブラリ(async, await)

とりあえず、

GlobalScope.launch {
    db.DiceDataDao().insertDiceData(dicedata)
}

とすると「GlobalScope.launch」内は別スレッドで起動するらしい。

全く駄目だわ

スレッドが一切機能していない。やはり付け焼き刃では駄目だったか。

でも「Android データベース スレッド」とかで検索しても全然ヒットしないんだよな。皆データベース関連の処理はどうやっているんだろう?あるいはAndroider(?)にとってはこんなの出来て当たり前だったりして・・・

とりあえず今は

val db = Room.databaseBuilder(
                applicationContext,
                AppDatabase::class.java, "database-name"
            ).allowMainThreadQueries()
                .build()

とする。「.allowMainThreadQueries()」をつける事によってメインスレッドでも動作させる事が出来るようになるらしい。

「そんな実装で大丈夫か?」

―大丈夫じゃない、問題だ

勿論本番では別スレッドで動かさなければならない。とりあえずテスト用としてやっているだけだ。

やっぱり今回も駄目だったよ・・・

どうやら同じIDは2つ登録する事が出来ないらしい。まあ当たり前だ。そんな事をしたらどっちがどっちのデータだったか判別できなくなってしまう。

いや、ちょっと待て

・・・という事は、データの保存自体はうまく行っているのか?試しに取り出し処理を行ってみよう。

WOW、保存出来ているぞ!!勿論まだスレッド処理が出来ていないとか2つデータを保存したのに1つしか表示されないとかの問題はあるが、とりあえずRoomを使用してデータを保存する事が出来た!これは大きな前進だ。

とりあえずまずはスレッド問題をなんとかしてしまいたい。データの構造や詳細な取り出し方はまた後で考えよう。

今回はここまで。次回をお楽しみに!

この記事が気に入ったら
フォローしよう

最新情報をお届けします

おすすめの記事