web-dev-qa-db-ja.com

Kotlinを1.2からKotlin1.3.0に移行し、プレゼンター関数でasync、UI、およびbgを使用する方法

KotlinプロジェクトでMVPパターンを使用しています。プレゼンタークラスがあります:

import com.google.gson.Gson
import kotlinx.coroutines.experimental.Android.UI
import kotlinx.coroutines.experimental.async
import org.jetbrains.anko.coroutines.experimental.bg

class TeamsPresenter(private val view: TeamsView,
                     private val apiRepository: ApiRepository,
                     private val gson: Gson
) {
    fun getTeamList(league: String?) {
        view.showLoading()

        async(UI){
            val data = bg {
                gson.fromJson(apiRepository
                    .doRequest(TheSportDBApi.getTeams(league)),
                    TeamResponse::class.Java
                )
            }
            view.showTeamList(data.await().teams)
            view.hideLoading()
        }
    }   
}

このプレゼンタークラスはKotlin1.2.71で正常に機能していますが、Kotlin1.3.0では機能しません。

プロジェクトのbuild.gradleでKotlinバージョンを更新し、「実験的コルーチン」を削除して、kotlinコルーチンコアの依存関係を追加しました。

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0'

これが私の現在のコードです:

import com.google.gson.Gson

class TeamsPresenter(private val view: TeamsView,
                     private val apiRepository: ApiRepository,
                     private val gson: Gson
) {
    fun getTeamList(league: String?) {
        view.showLoading()

        async(UI){
            val data = bg {
                gson.fromJson(apiRepository
                    .doRequest(TheSportDBApi.getTeams(league)),
                    TeamResponse::class.Java
                )
            }
            view.showTeamList(data.await().teams)
            view.hideLoading()
        }
    }
}

主に非同期、UI、およびbg関数でのエラー:

unresolved reference: async
unresolved reference: UI
unresolved reference: bg

Kotlin 1.3.0でこれを機能させるにはどうすればよいですか?助けてくれて、よろしくお願いします。

6
Dika

コードにはいくつかの問題の層があります。

  1. asyncを使用していますが、awaitは使用していません。代わりにlaunchを使用する必要があります。
  2. bgと同等のasyncのコルーチン前機能を使用しています
  3. awaitですぐにbgします。つまり、代わりにwithContext(Default)を使用する必要があります。
  4. (Kotlin 1.3の新機能)適用していません 構造化された同時実行性

Kotlin1.3でのコードの外観は次のとおりです。

fun CoroutineScope.getTeamList(league: String?) {
    view.showLoading()
    this.launch {
        val data = withContext(Dispatchers.IO) {
            gson.fromJson(apiRepository.doRequest(TheSportDBApi.getTeams(league)),
                    TeamResponse::class.Java
            )
        }
        view.showTeamList(data.teams)
        view.hideLoading()
    }
}

状況に適したコルーチンスコープを使用して関数を呼び出す必要があります。典型的なアプローチはそれをあなたの活動に結びつけることです:

class MyActivity : AppCompatActivity(), CoroutineScope {
    lateinit var masterJob: Job
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + masterJob

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        masterJob = Job()
    }

    override fun onDestroy() {
        super.onDestroy()
        masterJob.cancel()
    }
}
3
Marko Topolnik

起動の代わりにGlobalScope.launchを使用し、UIの代わりに非同期Dispatcher.mainの代わりにGlobalScope.asyncを使用する必要があります

coroutineBasics

5
Kourosh

また、追加します

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-Android:1.0.1'

これが修正です(それが最善の方法かどうかはわかりません):

import com.google.gson.Gson
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch

class TeamsPresenter(private val view: TeamsView,
                     private val apiRepository: ApiRepository,
                     private val gson: Gson
) {
    fun getTeamList(league: String?) {
        view.showLoading()
        CoroutineScope(Dispatchers.Main).launch {
            val data = async {
                gson.fromJson(apiRepository
                    .doRequest(TheSportDBApi.getTeams(league)),
                    TeamResponse::class.Java
                )
            }
            view.showTeamList(data.await().teams)
            view.hideLoading()
        }
    }
}
2
Sid G