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でこれを機能させるにはどうすればよいですか?助けてくれて、よろしくお願いします。
コードにはいくつかの問題の層があります。
async
を使用していますが、await
は使用していません。代わりにlaunch
を使用する必要があります。bg
と同等のasync
のコルーチン前機能を使用していますawait
ですぐにbg
します。つまり、代わりにwithContext(Default)
を使用する必要があります。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()
}
}
起動の代わりにGlobalScope.launchを使用し、UIの代わりに非同期Dispatcher.mainの代わりにGlobalScope.asyncを使用する必要があります
また、追加します
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()
}
}
}