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
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
AIエージェントで 変わるAndroid開発環境
takahirom
2
770
AndroidアプリのAI実装をAndroidifyで学ぶ ー Google公式サンプルによる体験と実装 ー
takahirom
0
150
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
1.1k
Google の LLM ライブラリ を Android アプリで 使うには?
takahirom
1
2.2k
Robolectric Native Graphics and Roborazzi
takahirom
1
2.3k
Androidアプリで安定して動作させ継続的に開発するために設計の原則を利用して開発した話
takahirom
3
1.5k
Android Tools & Performance
takahirom
1
1.3k
Jetpack Compose State Practices
takahirom
1
1.5k
Inside Jetpack Compose
takahirom
1
1.1k
Other Decks in Programming
See All in Programming
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
170
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
VibeCodingからAgenticWorkflowへ
starfish719
0
230
霧の中の代数的エフェクト
funnyycat
1
460
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
560
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
520
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.8k
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.2k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
230
「人を評価する AI」の設計と実装
ryoyanara
0
150
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
220
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
560
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
240
Done Done
chrislema
186
16k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
400
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
390
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
330
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⢪剅ֹ倯ד剅ְגְֻ