タグ付けされた質問 「kotlin-coroutines」


6
コトリンコルーチンでのサスペンド機能の意味
私はコトリンコルーチンを読んでいて、それがsuspend機能に基づいていることを知っています。しかし、どういうsuspend意味ですか? コルーチンまたは関数が中断されますか? https://kotlinlang.org/docs/reference/coroutines.htmlから 基本的に、コルーチンはスレッドをブロックせずに中断できる計算です 「サスペンド機能」とよく言われます。しかし、関数が終了するのを待っているので中断されるのはコルーチンだと思いますか?「一時停止」は通常「操作を停止する」ことを意味します。この場合、コルーチンはアイドル状態です。 weコルーチンは一時停止されていると言えますか? どのコルーチンが一時停止されますか? https://kotlinlang.org/docs/reference/coroutines.htmlから 類推を続けると、await()は、何らかの計算が完了するまでコルーチンを中断してその結果を返す中断関数(したがって、非同期{}ブロック内からも呼び出し可能)にすることができます。 async { // Here I call it the outer async coroutine ... // Here I call computation the inner coroutine val result = computation.await() ... } 🤔「計算が完了するまでコルーチンを一時停止する」とありますが、コルーチンは軽量スレッドのようなものです。したがって、コルーチンが中断されている場合、どのように計算を実行できますか? 私たちは見るawaitに呼び出されたcomputationことがあるかもしれないので、asyncそれを返すDeferredことが別のコルーチンを開始できる手段、 fun computation(): Deferred<Boolean> { return async { true } } quote コルーチンを一時停止するという引用。それsuspendは外側のasyncコルーチン、またはsuspend内側のcomputationコルーチンを意味しますか? いsuspendながら、外側のことを意味しasyncコルーチンが(待っているawait内側のために)computationそれ(アウター、仕上げにコルーチンasyncコルーチン)スレッドプールには空転(名前の由来は、サスペンド)と戻り、スレッド、および時に子computationコルーチンが終了すると、それは(外asyncコルーチン)ウェイクアップし、プールから別のスレッドを取得して続行しますか? …

3
Kotlin:withContext()とAsync-await
私はkotlinのドキュメントを読んでいますが、正しく理解していれば、2つのKotlin関数は次のように機能します。 withContext(context):現在のコルーチンのコンテキストを切り替えます。指定されたブロックが実行されると、コルーチンは前のコンテキストに戻ります。 async(context):指定されたコンテキストで新しいコルーチンを開始.await()し、返されたDeferredタスクを呼び出すと、呼び出し元のコルーチンを一時停止し、生成されたコルーチン内で実行されているブロックが戻ったときに再開します。 次の2つのバージョンの場合code: バージョン1: launch(){ block1() val returned = async(context){ block2() }.await() block3() } バージョン2: launch(){ block1() val returned = withContext(context){ block2() } block3() } どちらのバージョンでも、block1()、block3()はデフォルトのコンテキスト(commonpool?)で実行されますが、block2()は指定されたコンテキストで実行されます。 全体的な実行は、block1()-> block2()-> block3()の順序と同期しています。 私が見る唯一の違いは、バージョン1が別のコルーチンを作成するのに対し、バージョン2はコンテキストの切り替え中に1つのコルーチンのみを実行することです。 私の質問は: それが使用することを常により良いではないwithContextのではなく、async-awaitそれが機能的に類似しているとして、しかし別のコルーチンを作成しません。多数のコルーチンは軽量ですが、要求の厳しいアプリケーションでは依然として問題になる可能性があります。 async-awaitより好ましいケースはありwithContextますか? 更新: Kotlin 1.2.50には、変換できるコード検査がありますasync(ctx) { }.await() to withContext(ctx) { }。


2
「不適切なブロッキングメソッドの呼び出し」を適切にする方法
私は現在、コトリンコルーチンをさらに活用しようとしています。しかし、私は問題に直面します。これらのコルーチン内でmoshiまたはokhttpを使用すると、警告が表示されます。 「不適切なブロッキングメソッドの呼び出し」 これらを修正する最良の方法は何ですか?私は本当に不適切になりたくありません;-)

3
Kotlin FlowとAndroid LiveData
Kotlin Flowについて質問があります 複数のフラグメントからのLiveDataを観察できます。これをFlowで実行できますか?はいの場合はどうですか? map&を使用して、1つのLiveDataから複数のLiveDataを取得できますswitchMap。単一のソースフローから複数のフローを作成する方法はありますか? 使用してMutableLiveData、私は、変数の参照を使用してどこからでもデータを更新することができます。Flowで同じことをする方法はありますか? 私は次のようなユースケースを持っています。単一のソースフローを提供するSharedPreferences使用法callbackFlow{...}を観察します。そのフローから、キーと値のペアごとに複数のフローを作成します。 これらはばかげた質問に聞こえるかもしれません。RxとFlowの世界は初めてです。

3
withTimeout関数でIllegalStateExceptionが発生する:イベントループはありません。runBlocking {…}を使用して開始します。Kotlin Multiplatform iOSクライアント
更新:最初にタイムアウトなしでコルーチンを実行し、次にwithTimeoutを実行すると機能します。しかし、最初にwithTimeoutコルーチンを実行すると、エラーが発生します。同じことが非同期にも当てはまります。 私はktorを使用してAPI呼び出しを実行するデモのkotlinマルチプラットフォームアプリケーションを作成しています。コルーチンレベルでwithTimeoutを使用しているので、ktorリクエストに構成可能なタイムアウト関数を設定したいと思います。 ネットワークAPIを使用した関数呼び出しを次に示します。 suspend fun <T> onNetworkWithTimeOut( url: String, timeoutInMillis: Long, block: suspend CoroutineScope.() -> Any): T { return withTimeout(timeoutInMillis) { withContext(dispatchers.io, block) } as T } suspend fun <T> onNetworkWithoutTimeOut(url: String, block: suspend CoroutineScope.() -> Any): T { return withContext(dispatchers.io, block) as T } iOSMainモジュールのAppDispatcherクラスを次に示します。 @InternalCoroutinesApi actual class AppDispatchersImpl …

2
Kotlin FlowとLiveData
前回のGoogle I / Oで、Jose AlcerrecaとYigit Boyar は、LiveDataを使用してデータをフェッチすることはもうやめるべきだと言っていました。ここで、ワンショットフェッチに中断関数を使用し、Kotlinのフローを使用してデータストリームを作成する必要があります。コルーチンはワンショットフェッチや挿入などの他のCRUD操作に最適であることに同意します。しかし、データストリームが必要な場合、Flowがどのような利点をもたらすかわかりません。LiveDataも同じことをしているようです。 フローの例: ViewModel val items = repository.fetchItems().asLiveData() リポジトリー fun fetchItems() = itemDao.getItems() ダオ @Query("SELECT * FROM item") fun getItems(): Flow<List<Item>> LiveDataの例: ViewModel val items = repository.fetchItems() リポジトリー fun fetchItems() = itemDao.getItems() ダオ @Query("SELECT * FROM item") fun getItems(): LiveData<List<Item>> また、コルーチンとFlowを使用してRoomまたはRetrofitを操作するプロジェクトの例もいくつか見たいと思います。コルーチンがワンショットフェッチに使用され、変更時にデータを手動で再フェッチするGoogleのToDoサンプルのみが見つかりました。

2
Kotlinコルーチンは「前に起こる」保証をしますか?
Kotlinコルーチンは「前に起こる」保証を提供しますか? たとえばmutableVar、この場合、他のスレッドへの(潜在的に)書き込みとその後の読み取りの間に「前に起こる」保証があります。 suspend fun doSomething() { var mutableVar = 0 withContext(Dispatchers.IO) { mutableVar = 1 } System.out.println("value: $mutableVar") } 編集: たぶん、追加の例は、(変更可能性を除いて)Kotlinっぽいので、問題をより明確にするでしょう。このコードはスレッドセーフですか? suspend fun doSomething() { var data = withContext(Dispatchers.IO) { Data(1) } System.out.println("value: ${data.data}") } private data class Data(var data: Int)

3
Kotlinコルーチンを使用したNetworkBoundResource
NetworkBoundResourceとKotlinコルーチンでリポジトリパターンを実装する方法について何かアイデアはありますか?GlobalScopeを使用してコルーチンを起動できることはわかっていますが、コルーチンのリークにつながる可能性があります。viewModelScopeをパラメーターとして渡したいのですが、実装に関しては少しトリッキーです(私のリポジトリはViewModelのCoroutineScopeを知らないためです)。 abstract class NetworkBoundResource<ResultType, RequestType> @MainThread constructor( private val coroutineScope: CoroutineScope ) { private val result = MediatorLiveData<Resource<ResultType>>() init { result.value = Resource.loading(null) @Suppress("LeakingThis") val dbSource = loadFromDb() result.addSource(dbSource) { data -> result.removeSource(dbSource) if (shouldFetch(data)) { fetchFromNetwork(dbSource) } else { result.addSource(dbSource) { newData -> setValue(Resource.success(newData)) } } } } @MainThread …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.