Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
完全に理解した気になる Kotlin Coroutines
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
takahirom
July 03, 2018
Programming
2.9k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
完全に理解した気になる Kotlin Coroutines
takahirom
July 03, 2018
More Decks by takahirom
See All by takahirom
AndroidアプリのAI実装をAndroidifyで学ぶ ー Google公式サンプルによる体験と実装 ー
takahirom
0
140
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
1k
Google の LLM ライブラリ を Android アプリで 使うには?
takahirom
1
2.1k
Robolectric Native Graphics and Roborazzi
takahirom
1
2.3k
Androidアプリで安定して動作させ継続的に開発するために設計の原則を利用して開発した話
takahirom
3
1.4k
Android Tools & Performance
takahirom
1
1.2k
Jetpack Compose State Practices
takahirom
1
1.4k
Inside Jetpack Compose
takahirom
1
1.1k
What’s new in Android Jetpack and Tools
takahirom
0
430
Other Decks in Programming
See All in Programming
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
250
A2UI という光を覗いてみる
satohjohn
1
120
さぁV100、メモリをお食べ・・・
nilpe
0
130
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.2k
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
480
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
1.9k
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.9k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
120
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
4
2.8k
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
New "Type" system on PicoRuby
pocke
1
780
Featured
See All Featured
Abbi's Birthday
coloredviolet
2
8k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
How STYLIGHT went responsive
nonsquared
100
6.2k
The Curious Case for Waylosing
cassininazir
1
380
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
Bash Introduction
62gerente
615
210k
Color Theory Basics | Prateek | Gurzu
gurzu
0
360
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Ethics towards AI in product and experience design
skipperchong
2
310
Transcript
㸣Ⰻח椚鍑׃孡חז ,PUMJO$PSPVUJOFT UBLBIJSPN
˖ UBLBIJSPN !OFX@SVOOBCMF דׅկ ˖ 劤せכ嬁「䃨峔 ׄױַמ דׅկ ˖ "OESPJEָ㥨ֹדׅ
˖ "CFNB57ך"OESPJE،فٔ⡲גְתׅկ ˖ 2JJUBח剅ְךדծ鋅זָ耀ְג ְֻׁկ ˖ IUUQTRJJUBDPNUBLBIJSPNJUFNT CBBEDDGCB 荈ⴓחאְג
$PSPVUJOFTך 椚鍑ָꨇ׃ְ
⢪$PSPVUJOFTך"1*
⢪$PSPVUJOFTך"1* ˖ MBVODI
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6*
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS ˖ SVO#MPDLJOH
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS ˖ SVO#MPDLJOH ˖ KPJO
⢪$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖
$PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS ˖ SVO#MPDLJOH ˖ KPJO ˖
㢳ְ
ת׆כ㛇劤涸זהַֿ ׯה椚鍑׃ְ
MBVODI launch { println("thread:"+Thread.currentThread()) } MBVODIדDPSPUVJOF饯⹛ׅ
MBVODI launch { println("thread:"+Thread.currentThread()) } thread:Thread[ForkJoinPool.commonPool-worker-2,5,main] MBVODIדDPSPUVJOF饯⹛ׅ
MBVODI launch { println("thread:"+Thread.currentThread()) } thread:Thread[ForkJoinPool.commonPool-worker-2,5,main] ֿ̓ך5ISFBEכוַֿ勻 MBVODIדDPSPUVJOF饯⹛ׅ
MBVODI launch { println("thread:"+Thread.currentThread()) } thread:Thread[ForkJoinPool.commonPool-worker-2,5,main] MBVODIדDPSPUVJOF饯⹛ׅ MBVODIך⚥鋅ח遤ֲֿ
MBVODI ך⚥魦 public fun launch( context: CoroutineContext = DefaultDispatcher, start:
CoroutineStart = CoroutineStart.DEFAULT, parent: Job? = null, onCompletion: CompletionHandler? = null, block: suspend CoroutineScope.() -> Unit ): Job { 㹋כ$PSPVUJOF$POUFYUד㹋遤ׅ5ISFBEָ寸ת
MBVODI ך$PSPVUJOF$POUFYU public fun launch( context: CoroutineContext = DefaultDispatcher, start:
CoroutineStart = CoroutineStart.DEFAULT, parent: Job? = null, onCompletion: CompletionHandler? = null, block: suspend CoroutineScope.() -> Unit ): Job { 䒷侧ך$PSPVUJOF$POUFYUכرؿٕؓزד%FGBVMU%JTQBUDIFS 植朐כ%FGBVMU%JTQBUDIFSכ$PNNPO1PPM public val DefaultDispatcher: CoroutineDispatcher = CommonPool
MBVODI ך$PSPVUJOF$POUFYU public fun launch( context: CoroutineContext = DefaultDispatcher, start:
CoroutineStart = CoroutineStart.DEFAULT, parent: Job? = null, onCompletion: CompletionHandler? = null, block: suspend CoroutineScope.() -> Unit ): Job { $PNNPO1PPM public val DefaultDispatcher: CoroutineDispatcher = CommonPool
MBVODI ד⢪גְ $PNNPO1PPM object CommonPool : CoroutineDispatcher() { override fun
dispatch( context: CoroutineContext, block: Runnable ) = try { (pool ?: getOrCreatePoolSync()).execute(timeSource.trackTask(block)) } … $PNNPO1PPMך EJTQBUDIًاحسָㄎל
MBVODI ד⢪גְ $PNNPO1PPM object CommonPool : CoroutineDispatcher() { override fun
dispatch( context: CoroutineContext, block: Runnable ) = try { (pool ?: getOrCreatePoolSync()).execute(timeSource.trackTask(block)) } … 5ISFBE1PPMָזֽל⡲ծFYFDVUFֽׅ
知⽃ז %JTQBUDIFS⡲ג
鑐׃ח$PSPVUJOF%JTQBUDIFS ⡲ג class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context:
CoroutineContext, block: Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } $PSPVUJOF%JTQBUDIFS竰䪫׃ؙٓأ⡲
鑐׃ח$PSPVUJOF%JTQBUDIFS ⡲ג class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context:
CoroutineContext, block: Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } 荈ⴓד⡲%JTQBUDIFS䭷㹀ׅ
鑐׃ח$PSPVUJOF%JTQBUDIFS ⡲ג class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context:
CoroutineContext, block: Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } EJTQBUDIًاحس㹋鄲׃ג
class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block:
Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } EJTQBUDICFGPSF UISFBE5ISFBE<NBJO NBJO> EJTQBUDIBGUFS ךתתךأٖحسד 㹋遤דֹ
$PSPVUJOFTג5ISFBEה ずׄדכ
$PSPVUJOFTחכ ⚥倖ָ֮
⚥倖 class MyDispatcher : CoroutineDispatcher() { val executor = Executors.newSingleThreadExecutor()
override fun dispatch(context: CoroutineContext, block: Runnable) { executor.execute { println("dispatch:before") block.run() println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine<String> { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } 㹋ꥷך⹛ֹח さׇ ➙㔐ך⢽דכ FYFDVUPS⢪ֲ
class MyDispatcher : CoroutineDispatcher() { val executor = Executors.newSingleThreadExecutor() override
fun dispatch(context: CoroutineContext, block: Runnable) { executor.execute { println("dispatch:before") block.run() println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine<String> { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } TVTQFOE$PSPVUJOF ⢪ֲה DPSPVUJOFT⚥倖דֹ
class MyDispatcher : CoroutineDispatcher() { val executor = Executors.newSingleThreadExecutor() override
fun dispatch(context: CoroutineContext, block: Runnable) { executor.execute { println("dispatch:before") block.run() println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine<String> { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } SFTVNF ⢪ֲהⱄדֹ
override fun dispatch(context: CoroutineContext, block: Runnable) executor.execute { println("dispatch:before") block.run()
println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine<String> { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } ⚥倖ה⚥倖䖓ךⱄד 㔐5ISFBE1PPMד 㹋遤ׁגְ EJTQBUDICFGPSF 5ISFBE<QPPMUISFBE NBJO> EJTQBUDIBGUFS ͜͜ͰҰதஅ EJTQBUDICFGPSF 5ISFBE<QPPMUISFBE NBJO> EJTQBUDIBGUFS
"OESPJEד 㹋ꥷוֲ⢪ֲ
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } "1*ַ《䖤׃גծךⰻ㺁4OBDLCBSח⳿ׅ⢽
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } "1*ַ《䖤׃גծךⰻ㺁4OBDLCBSח⳿ׅ⢽ 6*ծծ
val UI = HandlerContext(Handler(Looper.getMainLooper()), “UI") public class HandlerContext( private val
handler: Handler, private val name: String? = null ) : CoroutineDispatcher(), Delay { … override fun dispatch(context: CoroutineContext, block: Runnable) { handler.post(block) } launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } "OESPJEך)BOEMFS⡲
val UI = HandlerContext(Handler(Looper.getMainLooper()), “UI") public class HandlerContext( private val
handler: Handler, private val name: String? = null ) : CoroutineDispatcher(), Delay { … override fun dispatch(context: CoroutineContext, block: Runnable) { handler.post(block) } launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } "OESPJEך)BOEMFSחQPTUֽׅ
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() }
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } GFUDI ך⚥כ
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred<Response> } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } 3FUSPUח״㹋鄲
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred<Response> } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } SFUSPULPUMJODPSPVUJOFTBEBQUFS⢪ֲה %FGFSSFE鵤ׅ
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred<Response> } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } %FGFSSFEכBXBJU ֿׅהד穠卓《䖤דֹ BXBJU ㄎעֿהדDPSPVUJOFTָ⚥倖׃גծ 0L)UUQך鸐⥋أٖحسד《䖤׃גծ 《䖤דֹ如痥ⱄׅկ
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred<Response> } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } TVTQFOEًاحس⢪ֲהծ BXBJU 剅ַ׆חず劍涸ח《䖤׃גְ״ֲח剅ֽ ,PUMJOךط؎ذ؍ـזأة؎ٕכֿך剅ֹ倯 ˖ IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJODPSPVUJOFTJOGPSNBMNEBTZODISPOPVTQSPHSBNNJOHTUZMFT
launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action",
null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred<Response> } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } TVTQFOEًاحس⢪ֲחׂׂٓحف׃גְ ˖ IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJODPSPVUJOFTJOGPSNBMNEBTZODISPOPVTQSPHSBNNJOHTUZMFT
ְְ椚鍑דֹ
תה ˖ $PSPVUJFOTכ5ISFBE♳ד⹛ֻծ⹛ֹכ然钠דֹ ˖ ⚥倖ָדֹגⱄָדֹ ˖ TVTQFOE⢪剅ֹ倯ד剅ְגְֻ