Retrofit StateFlow ViewModel
使用前面文章retrofit、stateFlow、viewModel、lifecycleScope、viewModelScope
將MutableStateFlow的類型改為ArticleList。
在viewModelScope協程,呼叫網路連線。
1
2
3
4
5
6
7
8
9
10
class ArticleViewModel : ViewModel() {
val _articleList = MutableStateFlow<ArticleList?>(null)
val articleList: StateFlow<ArticleList?> = _articleList
fun getArticleList() {
viewModelScope.launch {
val result = ArticleApi.retrofit.articleList()
_articleList.value = result
}
}
}
Activity呼叫viewModel.getArticleList()。
lifecycleScope中viewModel._articleList.collect()收集接收網路回傳的資料。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MainActivity09 : AppCompatActivity() {
private val viewModel by viewModels<ArticleViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val submit = findViewById<Button>(R.id.button)
val textv = findViewById<TextView>(R.id.textView)
lifecycleScope.launch {
viewModel._articleList.collect { value ->
textv.text = value.toString()
}
}
submit.setOnClickListener {
viewModel.getArticleList()
}
}
}
Activity不直接面對Retrofit的網路連線,由ViewModel去面對Retrofit的網路連線,Activity只跟ViewModel溝通。
ViewModel處理網路資料的接收,與收到資料後,就發射資料,而Activity會使用collect()監視並接收ViewModel傳來的資料。
- viewModel.getArticleList()
- viewModel._articleList.collect()