在我学习协程以及如何在 android 应用程序中正确使用它们时,我发现了一些令我感到惊讶的事情。
在启动viewModelScope.launch { }lambda 中使用并设置断点启动协程时,我注意到我的应用程序不再响应,因为它仍在主线程上。
这让我感到困惑,因为文档viewModelScope.launch { }明确指出:
在不阻塞当前线程的情况下启动一个新的协程
当前线程不是主线程吗?如果默认情况下它不在不同的线程上运行,那么启动的全部目的是什么?
我能够viewModelScope.launch(Dispatchers.IO){ }在另一个线程上使用它按我的预期工作,即在另一个线程上运行它。
我试图通过该launch方法完成的是调用存储库并执行一些 IO 工作,即调用 Web 服务并将数据存储在房间数据库中。所以我想调用viewModelScope.launch(Dispatchers.IO){ }在不同的线程上完成所有工作,最后更新 LiveData 结果。
viewModelScope.launch(Dispatchers.IO){
liveData.postValue(someRepository.someWork())
}
所以我的第二个问题是,这是要走的路吗?
multithreading android coroutine android-architecture-components
我知道如何在Java中创建一个简单的20秒倒数计时器。但是我想在Kotlin中创建这个。
package android.os;
new CountDownTimer(20000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("Time's finished!");
}
}.start();
Run Code Online (Sandbox Code Playgroud)
如何使用Kotlin做到这一点?