今天會輕鬆一點,介紹coroutine的優勢
coroutine有點難決定從哪裡開始講,最後決定從android架構入手,因為常用以及他可以帶出之後幾天的東西
首先簡單介紹一下, android現在主要架構是MVVM, 由View, ViewModel, Model組成,View負責UI, ViewModel負責商業邏輯, Model負責資料
你要從網路抓資料由V跟VM拿, VM跟M拿,懂?
這邊我不再過度介紹了,開分支東西會講不完,可以到這裡了解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"
viewModelScope
如果有只會在viewModel裡才需要執行的工作,可以用viewModelScope設定作用域,當這個viewModel被清除時,此範圍內的協程都將會被自動取消,因為andoriod 將這個coroutine cancel的時間與viewModel的生命週期的onCleared先包好了,所以我們並不需要自己呼叫scope.cancel()
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