AndroidのKotlinで手っ取り早くsuspend関数を呼び出す方法

 どうも、ケーサンヨーシです。

今回は、コルーチンをよく知らないけどsuspend関数を呼び出したいというニッチな要望に答えたいと思います。

それでは行ってみましょう。

■□■□■

まずは、そもそものsuspend関数がなんなのかといえば、以下のような形のファンクションです。

suspend fun hogehoge(){
    // 中身色々
}

このsuspendの付いたファンクションは、Kotlinのコルーチンという機能の一部になります。

コルーチンというのは、大雑把に言ってしまえば、メインスレッドとそれ以外のスレッドを簡単に扱うことができる機能です(正確にはちょっと違うんですが、こういう認識があればとりあえず動かせます)。

んで、このsuspendというファンクションですが、これはメインスレッド以外のスレッドからしか呼び出せないように制限を掛けられたファンクションです。

ですので、普通にonCreate()から呼び出そうとしても、onCreate()がメインスレッドで動作しているため、エラーが出てしまいます。

このsuspendファンクションを呼び出すためには、以下の処理が必要です。

①コルーチンが使えるようにインポートを行う。

②メインスレッド以外で実行するブロックを作成し、suspendを呼び出す。


①コルーチンが使えるようにインポートを行う

build.gradleのdependenciesブロック内に以下を記載する。

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'

記載を行ったら、上の方に「Synk now」という青文字が出てくると思うので、それをクリックします。


②メインスレッド以外で実行するブロックを作成し、suspendを呼び出す

コルーチンでは、以下のようなブロックを作成することで、ブロック内は指定したスレッドで行われるようになります。

CoroutineScope(Dispatchers.Default).launch{
    // メインスレッド以外のスレッドで行われる
    // 例↓
    hogehoge()
}

ブロック内では、suspendのついたファンクションを呼び出すことができます。

もし、メインスレッドで実行したい場合は、Defaultの部分をmainに、ファイル読み書きや通信を行う場合にはIOを選択すると良いようです。

注意点ですが、コルーチンのブロック内は別スレッドのように、ブロック内とブロックの後部分が並列で実行されます。

ですので、ブロック内の処理を行った後にブロック後の処理を行う場合は、この書き方では正しく動作しませんので注意してください。

■□■□■

というわけで、手っ取り早くsuspendファンクションを呼び出す方法を紹介しました。

suspendがあるのに呼び出せないなんてどんな状況だよと思うかもしれませんが、私はAndroidの課金パッケージを導入する時に、とりあえず呼び出して実験したいがどうすればいいのか分からないという状況で、この方法が必要になりました。

最終的に公式ドキュメントを読み込んで動かすことができましたが、やはり手を使って動かしたほうが覚えやすいので、コルーチン学習の最初の一手として、この方法はおすすめです。

以上!

このブログの人気の投稿

動画編集ソフト「Shotcut」で縦向きの動画を横向きにする方法。

Audacityで音声部分のみを自動カットする方法

Android Studioでの動的なLayoutの幅と高さの変更方法