谁能解释一下为什么我的代码中会出现这些 "不适当的阻塞方法调用 "的警告?
我在Kotlin中写了此代码,以使用Coroutines下载一些API信息来下载数据.但是,该代码显示了许多警告,称该消息为" 不合适的阻止方法call ". 这是代码: class DownloadInfoClass { private lateinit var url: URL private lateinit var httpURLConnection: HttpURLConnection private lateinit var result: String private lateinit var inputStream: InputStream private lateinit var inputStreamReader: InputStreamReader private var dataMap: MutableMap = mutableMapOf() private fun d
0 2024-03-01
编程技术问答社区
如何将暂停功能作为显式参数传递给coroutine builder?
我正在研究launch Coroutine Builder,将Coroutine代码作为block: suspend CoroutineScope.() -> Unit>.我们通常将代码作为lambda传递.但是,我想知道如何将此函数作为显式参数传递到启动功能. coroutineScope { launch(block = ::myFunction) } suspend fun CoroutineScope.myFunction(): Unit { // coroutine code } 它给出以下错误 Type mismatch. Required: suspend CoroutineScope.() → Unit Found: KSuspendFunction0 我缺少什么? 解决方案 扩展功能的语法参考与成员函数相同: launch(block = CoroutineScope::myFunction) 其他解决
2 2024-02-26
编程技术问答社区
如何用Android WorkManager同步运行CoroutineWorker?
我在应用程序中使用WorkManager将多重CoroutineWorkers链接在一起.我正在尝试测试我的应用程序,并让这些工人同步运行,然后再进行其余的测试. as CoroutineWorker是悬浮函数,它不使用提供给工人Configuration的SynchronousExecutor(). 如何提供CoroutineContext并与测试代码同步运行? @Test fun LaunchLongRunningCoroutineworkersWithWorkManager_FailsDueToAsynchronosity() { hiltRule.inject() context = InstrumentationRegistry.getInstrumentation().targetContext val config = Configuration.Builder() .setWorkerFactory(delegating
0 2024-02-19
编程技术问答社区
如何正确取消CoroutineWorker
我有一个Coroutineworker,当用户与我的应用程序交互时需要启动和停止,因此我使用等待cancancelation()方法,例如: override suspend fun doWork(): Result { try { startListen() awaitCancellation() } finally { stopListen() return Result.success() } } 都可以正常工作,但是当我致电 workmanager.cancel 并取消我的工作时,WorkerWrapper会抛出内部例外: I/WM-WorkerWrapper: Work [ id=721c463b-15aa-4daa-988d-a4c080915443, tags={ br.com.example.app.wor
0 2024-02-19
编程技术问答社区
长期运行的工人发行工作的工作:获得异常Kotlinx.coroutines.jobcancellation exception:在Kotlin的Coroutineworker中取消了Job
我创建了一个简单的CoroutineWorker,该>延迟1000毫秒. 这个工人是独特的周期性工人,有15分钟作为重复间隔,ExistingPeriodicWorkPolicy作为Keep 但是,当我启动工人并在执行工人的一段时间后被取消,例外JobCancellationException 完整的例外: Exception kotlinx.coroutines.JobCancellationException: Job was cancelled; job=JobImpl{Cancelling}@ba57765 12:55:47.088 WM-Wor...rapper I Work [ id=4c44c3da-3c57-4cac-a40a-82c948125807, tags={ com.sk.workmanagerdemo1.DownloadingWorker } ] was cancelled
8 2024-02-19
编程技术问答社区
有什么方法可以知道你的冠词是否已经从暂停函数中被取消了?
我正在使用Coroutineworker,但我所有的业务逻辑都是我开始使用悬挂功能的单独类.我希望将所有逻辑保留在此类中,但是我需要知道是否已取消工作请求.是否已取消悬浮函数中有某种需要知道的地方吗? 解决方案 确定当前Job是否仍处于活动状态(尚未完成并且尚未取消)suspend函数中可以使用suspend fun callApi() = withContext(Dispatchers.IO) { //... if (!isActive) { // coroutine is not active } } 检查取消的另一种常见方法是呼叫 ensureActive() ,这是用于Job,CoroutineScope和CoroutineContext的扩展功能.示例: suspend fun callApi() = withContext(Dispatchers.IO) { //... ensureActive() // it throws a Canc
4 2024-02-19
编程技术问答社区
将广播接收机包入Flow(coroutine)。
我有一个广播接收器作为WiFi扫描结果作为数据源,我想以Coroutine方式进行.我在这里找到了暂停功能的答案: https://stackoverflow.com/a/53520496/5938671 suspend fun getCurrentScanResult(): List = suspendCancellableCoroutine { cont -> //define broadcast reciever val wifiScanReceiver = object : BroadcastReceiver() { override fun onReceive(c: Context, intent: Intent) { if (intent.action?.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
0 2024-02-19
编程技术问答社区
我如何使用volley的coroutines,使我的代码可以写得像sychronous?
这是developer.android.com 的示例 class MainActivity : AppCompatActivity() { lateinit var textView:TextView lateinit var button:Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView = findViewById(R.id.textView) button = findViewById(R.id.button) button.setOnClickListener({ getData() }) } fun getData(){ val queue = Volley.
0 2024-02-19
编程技术问答社区
片段不会随时更改
我正在Kotlin中使用Flow和MutateStates.我在viewModel中有Data的列表,与几个不同的片段相对应.根据我以前的问题,仅更新了在mutableStateFlow 中仅更新必要的组件,我使用建议的解决方案使每个单独的碎片都开始了自己的流动.但是,在我的数据更改后,我的片段没有被更新.我想知道我是否做任何事情.这是我的代码: AppViewModel class AppViewModel : ViewModel() { var dataList: MutableStateFlow> = MutableStateFlow(listOf()); fun getDataForFragment(index: Int): Flow = dataList.map { it[index] }.distinctUntilChanged() fun updateStat
0 2024-02-19
编程技术问答社区
如何在Android中关闭屏幕后的Coroutine(活动/片段)在Android中关闭?
Activity类: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val vm = getViewModel() vm.invoke() } } inline fun FragmentActivity.getViewModel(): T { return ViewModelProvider(this)[T::class.java] } 我的ViewModel类中的代码如下: class MyViewModel : ViewModel() { private val repository: Re
12 2024-02-19
编程技术问答社区
在Coroutine kotlin中使用sharedPrefrence可以吗?
我在ViewModel中注射了sharedPreference. 我可以在嵌入Coroutine范围时使用Android特定资源的资源,该范围在ViewModel失去范围时会自动悬挂. 我的意思是,如果我们添加viewModel启动范围 一个CoroutinesCope跟踪其创建的所有Coroutines.因此,如果取消示波器,则取消其创建的所有Coroutines @ContributesViewModel class SplashViewModel @Inject constructor(private val prefs: PrefStore) : BaseViewModel() { val onMoveToNext = ClassLiveData() init { scope.launch { val activity = if(prefs.isLoggedIn()) HomeActivity::
0 2024-02-19
编程技术问答社区
viewModelScope未被取消
看完 sean在Android上的解释(Google I/O'19)我已经尝试过相同: init{ viewModelScope.launch { Timber.i("coroutine awake") while (true){ delay(2_000) Timber.i("another round trip") } } } 不幸的是onCleared当活动被杀死时,它被调用,而不是将其放在后台时("当我们离开活动..."时,背景是"移开" Imho ^^). 我得到以下输出: > ---- Activity in Foreground > 12:41:10.195 TEST: coroutine awake > 12:41:12.215 TEST: another round trip > 12:41:14.231 TEST: another
0 2024-02-19
编程技术问答社区
安卓中的LiveDataScope vs ViewModelScope
我正在阅读如何在此处阅读coroutines 主题/图书馆/架构/Coroutines .让我感到困惑的是LiveDataScope和ViewModelScope之间的区别.听起来像ViewModelScope自动照顾生命周期,您可以在块中执行网络请求.当从服务器接收到数据时,将值发布到livedata.但是,当我继续阅读时,关于LiveDataScope的另一个主题对我来说似乎是多余的,因为您已经可以通过使用livedata来完成相同的结果.这两个之间的主要区别是什么?我什么时候应该选择使用一个? 解决方案 注意:如果 Op 的作者已经对此有所了解,这可能是该主题的较晚答案,但是为 @的引用评论提供了一些指示. igorganapolsky. 让我们看看在一个> 1. ViewModelsCope: 官方文档说,CoroutineScope与此ViewModel绑定.这 ViewModel清除时,范围将被取消,即 ViewModel.onCleared称为
0 2024-02-19
编程技术问答社区
什么时候使用withContext?
目前我的代码看起来像这样: 我有一个ViewModel调用存储库进行一些背景计算并返回结果. ViewModel函数是使用viewModelScope.launch(Dispatchers.IO)运行的,然后存储库是suspend函数. 我是否必须使用return withContext {}来确保一切都会顺序完成?我检查了一下,确实是顺序的,但是在文档中,我发现它不一定是吗? 解决方案 让我们首先从其源代码中解剖viewModelScope.它使用CouroutineScope的自定义实现.上下文包括/a>和a discatcher .main 调度员.这样可以确保在主线程上启动Coroutine,并且失败不会影响示波器中的其他Coroutines. CloseableCoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)) 值得探索的几个例子. viewModelScope.l
0 2024-02-19
编程技术问答社区
Kotlin coroutines为2个或更多不同的并发请求进行等待
我正在使用Kotlin Coroutines通过ViewModel在Android中获得响应. 问题是我想获得两个不同的请求响应以更新UI,但想同时执行它们,并等待它们两个完成.然后使用收到的所有结果更新UI. 如果每个请求之后使用异步并等待等待,则它将逐一执行,并且不是并发,并且使用请求映射和等待(),我无法处理多个数据类型(数据类),因为两个请求的数据类型是不同的. 可能还有两个请求. 在这种情况下我该怎么办? val job = viewModelScope.launch { val a = async { firstUseCase.execute() }.await() val b = async { secondUseCase.execute() }.await() } 解决方案 您只需要首先启动每个请求async即可获得并发行为,然后await await,无论您是一次单独进行还是一次,与awaitAll. 单独:
0 2024-02-19
编程技术问答社区
在Kotlin Coroutines中复古调用 viewModelScope
最近,我已经更新了我的ViewModel以使用新的viewModelScope.从其实施中,我看到Dispatchers.Main.immediate被设置为viewModelScope>. 的默认CoroutineDispatcher 因此,当打印当前Thread viewModelScope.launch时,它给出螺纹[main,5,main] ,但是即使在主线程中运行,以下代码对我有效,该代码执行网络调用. viewModelScope.launch { userRepo.login(email, password) } 在这里 那么,如果我的当前线程为主线程,则如何工作? 解决方案 它起作用,因为改造的suspend实现委托给Call.enqueue.这意味着它已经在默认情况下在其自己的背景执行程序上执行,而不是使用呼叫者的Dispatcher. . 其他解决方案 悬挂功能总是可以安全地从主线程调用.但是,如果您要进行繁重的操作,
0 2024-02-19
编程技术问答社区
单元测试新的Kotlin coroutine StateFlow
最近,类 StateFlow是作为Kotlin Coroutines的一部分引入的 我目前正在尝试并在试图单位测试我的 viewModel 时遇到问题.我要实现的目标:测试我的 stateflow 正在以我的 viewModel . 我的代码如下. ViewModel: class WalletViewModel(private val getUserWallets: GetUersWallets) : ViewModel() { val userWallet: StateFlow> get() = _userWallets private val _userWallets: MutableStateFlow> = MutableStateFlow(State.Init) fun getUserWallets() { viewModelScope.launch {
0 2024-02-19
编程技术问答社区
不能用协同例程异步更新用户界面
我使用联合范围内部范围内的async-wait语法在我的Android主屏幕窗口小部件(AppWidgetProvider类)中调用悬挂功能.这些值是从数据库中获取的,并将其正确记录.但是,UI没有以相同的值更新.这是与共同规定有关的代码: scope.launch { val db = Room.databaseBuilder( context, AppDatabase::class.java, "db" ).build() val todosDAO = db.TodoDAO() val todosAsync = async { todosDAO.getByTimeType("day")
0 2024-02-19
编程技术问答社区
安卓测试室+分页3+流量测试每次都有不同的结果
分页3,带有房间. 我已经创建了一个应用程序,就像示例这是我在dao中所拥有的: @Query("SELECT * FROM Model") fun getModels(): PagingSource @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertAll(list: MutableList) : Completable 我想这样测试: @OptIn(ExperimentalCoroutinesApi::class) class DAOTest { private lateinit var dao: Dao private lateinit var db: ModelDatabase private lateinit var viewModel: MyViewModel lateinit var context: Context
对有延迟的Kotlin coroutine进行单元测试
我正在尝试单元测试使用delay()的Kotlin Coroutine.对于单位测试,我不在乎delay(),它只是在减慢测试.我想以某种方式运行测试,而在调用delay()时实际上不会延迟. 我尝试使用自定义上下文来运行Coroutine,该上下文将其委派给CommonPool: class TestUiContext : CoroutineDispatcher(), Delay { suspend override fun delay(time: Long, unit: TimeUnit) { // I'd like it to call this } override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation) { // but instead it ca
4 2024-02-19
编程技术问答社区