iT邦幫忙

2021 iThome 鐵人賽

DAY 2
1

今天會輕鬆一點,介紹coroutine的優勢

coroutine有點難決定從哪裡開始講,最後決定從android架構入手,因為常用以及他可以帶出之後幾天的東西

首先簡單介紹一下, android現在主要架構是MVVM, 由View, ViewModel, Model組成,View負責UI, ViewModel負責商業邏輯, Model負責資料

你要從網路抓資料由V跟VM拿, VM跟M拿,懂?
mvvm-architecture

這邊我不再過度介紹了,開分支東西會講不完,可以到這裡了解MVVM架構

那android針對coroutine也推出了下面兩種coroutine的延伸方法,首先在gradle加入

//viewModelScope
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"

//lifecycleScope
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
  1. viewModelScope
    如果有只會在viewModel裡才需要執行的工作,可以用viewModelScope設定作用域,當這個viewModel被清除時,此範圍內的協程都將會被自動取消,因為andoriod 將這個coroutine cancel的時間與viewModel的生命週期的onCleared先包好了,所以我們並不需要自己呼叫scope.cancel()

  2. lifecycleScope
    對每個lifecycle對象(像是fragment/ activity)定義協程,會在lifecycle被銷毀時取消協程內的工作,原理同上

共通點 : 如果不指定dispatcher的話,會在主線程執行

這邊我會簡化一下,給個viewModel抓資料的方式

fun getApi(){
    viewModelScope.launch( Dispatcher.IO){
        connect.getPostList() //return Post
    }
}

再來個原先callback的寫法,你看少了什麼

fun getApi(){
    connect.getPostListCallBack().enqueue(object :Callback<Post>{
        override fun onResponse(call: Call<Post>, response: Response<Post>) {

        }
        override fun onFailure(call: Call<Post>, t: Throwable) {

        }
    })
}

少了callback呀,少了討厭又難看的callback呀,沒錯你用了coroutine直接不用寫callback,不只讓code更簡潔,也完全避免了callback地獄,心動吧期待吧,還不趕快來一起學coroutine

對於新手或小型的專案,搭配retrofit或room或其他第三方套件,這樣就完成了異步操作的基本需求囉

小知識:callback其實沒有不見,現在是由Finite-state machine在編譯時幫我們產出callback


上一篇
day1 你說用coroutine講30天會不會太過分
下一篇
day3 讓我看看,什麼是Coroutine Scope
系列文
解鎖kotlin coroutine的各種姿勢-新手篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言