この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
kotlin:coroutines [2019/10/14 14:37] ips |
kotlin:coroutines [2020/01/14 07:03] (現在) ips [まとめ] |
||
|---|---|---|---|
| ライン 193: | ライン 193: | ||
| </code> | </code> | ||
| + | <code kotlin> | ||
| + | Log.d( "coroutine","start") | ||
| + | GlobalScope.launch(Dispatchers.Main) { | ||
| + | Log.d( "coroutine","coroutin") | ||
| + | Text.text="click" // 画面のテキストを変更する | ||
| + | } | ||
| + | Log.d( "coroutine","end") | ||
| + | ↓ | ||
| + | 2020-01-14 06:24:17.847 7602-7602/com.nekotype.ips.coroutine D/coroutine: start | ||
| + | 2020-01-14 06:24:17.847 7602-7602/com.nekotype.ips.coroutine D/coroutine: end | ||
| + | 2020-01-14 06:24:17.849 7602-7602/com.nekotype.ips.coroutine D/coroutine: coroutin | ||
| + | </code> | ||
| + | ===== キャンセル ===== | ||
| + | |||
| + | <code> | ||
| + | private var myjob:Job? =null | ||
| + | private var myjobs= mutableListOf<Job?>() | ||
| + | |||
| + | ... | ||
| + | myjob=GlobalScope.launch { | ||
| + | progress_countdown.max=1000 | ||
| + | ... | ||
| + | | ||
| + | // 画面を閉じた場合にコルーチンをキャンセル | ||
| + | override fun onPause() { | ||
| + | super.onPause() | ||
| + | myjobs.map { | ||
| + | Log.d("choice","cancel") | ||
| + | it?.cancel() | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </code> | ||
| + | |||
| + | ===== join ===== | ||
| + | コルーチン内で他のコルーチンの終了を待機する。 | ||
| + | |||
| + | <code kotlin> | ||
| + | fun TestCoroutin(){ | ||
| + | Log.d( "coroutine","start") | ||
| + | GlobalScope.launch() { | ||
| + | |||
| + | launch { | ||
| + | Log.d( "coroutine","coroutin_inner") | ||
| + | } | ||
| + | |||
| + | Log.d( "coroutine","coroutin_outer") | ||
| + | } | ||
| + | Log.d( "coroutine","end") | ||
| + | } | ||
| + | ↓ | ||
| + | 2020-01-14 06:29:12.311 7952-7952/com.nekotype.ips.coroutine D/coroutine: start | ||
| + | 2020-01-14 06:29:12.340 7952-7952/com.nekotype.ips.coroutine D/coroutine: end | ||
| + | 2020-01-14 06:29:12.347 7952-7998/com.nekotype.ips.coroutine D/coroutine: coroutin_outer | ||
| + | 2020-01-14 06:29:12.348 7952-7999/com.nekotype.ips.coroutine D/coroutine: coroutin_inner | ||
| + | </code> | ||
| + | ↓ | ||
| + | <code kotlin> | ||
| + | fun TestCoroutin(){ | ||
| + | Log.d( "coroutine","start") | ||
| + | GlobalScope.launch() { | ||
| + | |||
| + | launch { | ||
| + | Log.d( "coroutine","coroutin_inner") | ||
| + | }.join() // 待つ | ||
| + | |||
| + | Log.d( "coroutine","coroutin_outer") | ||
| + | } | ||
| + | Log.d( "coroutine","end") | ||
| + | } | ||
| + | ↓ | ||
| + | 2020-01-14 06:30:51.472 8058-8058/com.nekotype.ips.coroutine D/coroutine: start | ||
| + | 2020-01-14 06:30:51.500 8058-8058/com.nekotype.ips.coroutine D/coroutine: end | ||
| + | 2020-01-14 06:30:51.505 8058-8111/com.nekotype.ips.coroutine D/coroutine: coroutin_inner //順番が変わる | ||
| + | 2020-01-14 06:30:51.508 8058-8110/com.nekotype.ips.coroutine D/coroutine: coroutin_outer //順番が変わる | ||
| + | </code> | ||
| + | |||
| + | |||
| + | ===== runBlockingとasync ===== | ||
| + | runBlockingとasyncは戻り値をもつことができる。 | ||
| + | asyncは非同期に処理する。asyncにはawaitでまつことができる。 | ||
| + | |||
| + | ===== まとめ ===== | ||
| + | |||
| + | UIにアクセスするには | ||
| + | GlobalScope.launch(Dispatchers.Main) {... | ||
| + | |||
| + | Jobを取得してキャンセルするには | ||
| + | myjob=GlobalScope.launch { ... | ||
| + | myjob.cancel() | ||
| + | |||
| + | 戻り値を取得するには | ||
| + | runBlocking | ||
| + | async | ||
| + | |||
| + | 待ちたいとき(同期) | ||
| + | GlobalScope.launch() { | ||
| + | launch { ... }.join() | ||
| + | |||
| + | 待ちたいとき(非同期) | ||
| + | GlobalScope.launch() { | ||
| + | async { ... }.await() | ||