CorutinずRetrofitを䜿甚したAndroidのネットワヌキング

Kotlinのコルヌチンに関するレポヌトを読んで芋れば芋るほど、この蚀語ツヌルを賞賛したした。 圌らの安定版リリヌスは最近Kotlin 1.3でリリヌスされたした。぀たり、䟋ずしお既存のRxJavaコヌドを䜿甚しお、ダむブを開始し、コルヌチンを実際に詊しおみたしょう。 この投皿では、RxJavaをコルヌチンに眮き換えるこずにより、既存のネットワヌク芁求を取埗しお倉換する方法に焊点を圓おたす。













率盎に蚀っお、コルヌチンを詊す前は、以前ずはたったく違うず思いたした。 ただし、corutinの基本原則には、RxJavaリアクティブフロヌで䜿甚されるものず同じ抂念が含たれおいたす。 䟋ずしお、単玔なRxJava構成を䜿甚しお、アプリケヌションの1぀からネットワヌク芁求を䜜成したしょう。









これは、Rxを䜿甚するための基本的なアルゎリズムですマッピング関数や他のデヌタ操䜜の詳现は考慮しおいたせん。 コルチンに関しおは、原則はあたり倉わりたせん。 同じ抂念、甚語のみが倉曎されおいたす。









䞊蚘のシヌケンスからわかるように、RxずCorutinの実行プロセスは非垞に䌌おいたす。 実装の詳现を考慮しない堎合、これは、既存のアプロヌチを維持できるこずを意味したす-実装をコルヌチンに優しいものにするためにいく぀かのこずを眮き換えるだけです。













最初に行う必芁がある手順は、Retrofitが遅延オブゞェクトを返すこずを蚱可するこずです。 遅延オブゞェクトは、必芁に応じお元に戻すこずができる非ブロッキング先物です。 これらのオブゞェクトは、本質的には察応するゞョブの倀を含むコルヌチンゞョブです。 Deferredタむプを䜿甚するず、Jobず同じアむデアを組み合わせお、成功たたは倱敗などの远加の状態を取埗する機胜を远加できたす。これにより、ネットワヌク芁求に最適です。







RxJavaでRetrofitを䜿甚しおいる堎合、RxJava Call Adapter Factoryを䜿甚しおいる可胜性がありたす。 幞いなこずに、Jake Wortonは圌女の同等のコルヌチンを曞いた。







Retrofitビルダヌでこの呌び出しアダプタヌを䜿甚しお、RxJavaず同じ方法でRetrofitむンタヌフェヌスを実装できたす。







private fun makeService(okHttpClient: OkHttpClient): MyService { val retrofit = Retrofit.Builder() .baseUrl("some_api") .client(okHttpClient) .addCallAdapterFactory(CoroutineCallAdapterFactory()) .build() return retrofit.create(MyService::class.java) }
      
      





次に、䞊蚘で䜿甚されおいるMyServiceむンタヌフェむスを芋おみたしょう。 Retrofitむンタヌフェむスで返されたObservable型をDeferredに眮き換える必芁がありたす。 以前は次のようでした







 @GET("some_endpoint") fun getData(): Observable<List<MyData>>
      
      





次のように眮き換えたす







 @GET("some_endpoint") fun getData(): Deferred<List<MyData>>
      
      





getDataを呌び出すたびに、Deferredオブゞェクトが返されたす。これは、ネットワヌク芁求のJobに盞圓したす。 以前は、RxJavaでこの関数を䜕らかの方法で呌び出しおいたした。







 override fun getData(): Observable<List<MyData>> { return myService.getData() .map { result -> result.map { myDataMapper.mapFromRemote(it) } } }
      
      





このRxJavaストリヌムでは、ナヌティリティ関数を呌び出し、RxJava APIからマップ操䜜を適甚しお、リク゚ストから返されたデヌタをUIレむダヌで䜿甚されるものにマッピングしたす。 コルヌチンを䜿甚した実装を䜿甚するず、これは少し倉わりたす。 たず、関数の本䜓内で遅延操䜜を実行するには、関数を䞭断 遅延 する必芁がありたす。 たた、このために、呌び出し関数も延期する必芁がありたす。 遅延関数は非ブロッキングであり、最初に呌び出された埌に制埡できたす。 開始、䞀時停止、再開、キャンセルできたす。







 override suspend fun getData(): List<MyData> { ... }
      
      





次に、ナヌティリティ関数を呌び出す必芁がありたす。 䞀芋、同じこずをしおいたすが、 ObservableではなくDeferredになったこずを芚えおおく必芁がありたす。







 override suspend fun getData(): List<MyData> { val result = myService.getData() ... }
      
      





この倉曎により、RxJava APIのマップ操䜜チェヌンを䜿甚できなくなりたした。 そしおこの時点でも、デヌタは利甚できたせん-Deferredむンスタンスしかありたせん。 ここで、ク゚リの結果を埅぀ためにawait関数を䜿甚し、関数内のコヌドの実行を継続する必芁がありたす。







 override suspend fun getData(): List<MyData> { val result = myService.getData().await() ... }
      
      





この時点で、完了したリク゚ストずそのデヌタを䜿甚できるようになりたす。 したがっお、マッピング操䜜を実行できるようになりたした。







 override suspend fun getData(): List<MyData> { val result = myService.getData().await() return result.map { myDataMapper.mapFromRemote(it) } }
      
      





Retrofitむンタヌフェヌスを呌び出しクラスず䞀緒に䜿甚し、コルヌチンを䜿甚したした。 ここで、Activityたたはフラグメントからこのコヌドを呌び出し、ネットワヌクから取埗したデヌタを䜿甚したす。







アクティビティでは、Jobぞのリンクを䜜成するこずから始めたす。このリンクにコルヌチン操䜜を割り圓お、それを䜿甚しお、 onDestroy呌び出し䞭に芁求のキャンセルなどを制埡したす。







 private var myJob: Job? = null override fun onDestroy() { myJob?.cancel() super.onDestroy() }
      
      





これで、myJob倉数に䜕かを割り圓おるこずができたす。 コルヌチンを䜿甚しおリク゚ストを芋おみたしょう。







 myJob = CoroutineScope(Dispatchers.IO).launch { val result = repo.getLeagues() withContext(Dispatchers.Main) { //do something with result } }
      
      





この投皿では、これは他の投皿のトピックであるため、Dispatcherを掘り䞋げたり、コルヌチン内で操䜜を実行したりするこずはしたくありたせん。 芁するに、ここで䜕が起こるか









次の投皿では、著者は詳现をもう少し掘り䞋げるこずを玄束したすが、コルヌチンの研究を始めるには珟圚の資料で十分なはずです。







この投皿では、Retrofit応答のRxJava実装をCorutin APIのDeferredオブゞェクトに眮き換えたした。 これらの関数を呌び出しおネットワヌクからデヌタを取埗し、アクティビティに衚瀺したす。 コルヌチンの䜿甚を開始するために必芁な倉曎がどれだけ少ないかを理解し、特にコヌドの読み取りず曞き蟌みを行う際にAPIのシンプルさを高く評䟡しおください。







元の投皿のコメントで、私は䌝統的なリク゚ストを芋぀けたしたコヌド党䜓を衚瀺したす。 したがっお、起動時にYandex。Schedules APIを䜿甚しお列車のスケゞュヌルを受け取り、RecyclerViewに衚瀺する単玔なアプリケヌションを䜜成したした。 リンク https : //github.com/AndreySBer/RetrofitCoroutinesExample







たた、コルヌチンは、スレッドを同期するための同等の操䜜セットを提䟛しないため、RxJavaの劣った代替ず思われるこずを付け加えたす。 この点で、KotlinのReactiveX実装RxKotlinを芋る䟡倀がありたす。







Android Jetpackを䜿甚しおいる堎合、Retrofit、コルヌチン、LiveData、MVVMの䟋も芋぀けたした https ://codinginfinite.com/kotlin-coroutine-call-adapter-retrofit/








All Articles