标签: kotlin-coroutines

如何使“不适当的阻塞方法调用”合适?

我目前正在尝试更多地利用 kotlin 协程。但我面临一个问题:在这些协程中使用 moshi 或 okhttp 时,我收到警告:

“不适当的阻塞方法调用”

解决这些问题的最佳方法是什么?我真的不想不合适;-)

kotlin okhttp moshi kotlin-coroutines

172
推荐指数
6
解决办法
5万
查看次数

Kotlin协同程序中的launch/join和async/await之间有什么区别

kotlinx.coroutines库中,您可以使用launch(with join)或async(with await)启动新的协同程序.他们之间有什么区别?

asynchronous coroutine kotlin kotlin-coroutines

122
推荐指数
6
解决办法
2万
查看次数

Android AsyncTask API 在 Android 11 中弃用。有哪些替代方案?

Google 正在弃用 Android 11 中的 Android AsyncTask API,并建议java.util.concurrent改用。你可以在这里查看提交

 *
 * @deprecated Use the standard <code>java.util.concurrent</code> or
 *   <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
 *   Kotlin concurrency utilities</a> instead.
 */
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
Run Code Online (Sandbox Code Playgroud)

如果您在 Android 中维护带有异步任务的旧代码库,则将来可能需要对其进行更改。我的问题是,使用java.util.concurrent. 它是一个 Activity 的静态内部类。我正在寻找可以使用的东西minSdkVersion 16

private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
        private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
        private WeakReference<MyActivity> activityReference;

        LongRunningTask(MyActivity context) {
            activityReference = new WeakReference<>(context);
        }

        @Override
        protected MyPojo doInBackground(String... params) { …
Run Code Online (Sandbox Code Playgroud)

java android kotlin kotlin-coroutines

120
推荐指数
9
解决办法
9万
查看次数

可以将"实验性"Kotlin协程用于生产吗?

Kotlin协程可以用于生产,它们的实验状态意味着什么?

coroutine kotlin kotlin-coroutines

78
推荐指数
1
解决办法
6567
查看次数

Kotlin:withContext()vs Async-await

我一直是kotlin文档,如果我理解正确,两个kotlin函数的工作原理如下:

  1. withContext(context):切换当前协同程序的上下文,当给定的块执行时,协同程序切换回上一个上下文.
  2. async(context):在给定的上下文中启动一个新的协同程序,如果我们调用.await()返回的Deferred任务,它将挂起调用协程并在生成的协同程序内执行的块返回时恢复.

现在为以下两个版本code:

版本1:

  launch(){
    block1()
    val returned = async(context){
      block2()
    }.await()
    block3()
  }
Run Code Online (Sandbox Code Playgroud)

版本2:

  launch(){
    block1()
     val returned = withContext(context){
      block2()
    }
    block3()
  }
Run Code Online (Sandbox Code Playgroud)
  1. 在两个版本中,block1(),block3()在默认上下文(commonpool?)中执行,其中block()在给定的上下文中执行.
  2. 整体执行与block1() - > block2() - > block3()顺序同步.
  3. 我看到的唯一区别是version1创建了另一个协程,其中version2在切换上下文时只执行一个协同程序.

我的问题是:

  1. 使用它并不总是更好,withContext而不是async-await功能相似,但不会创建另一个协同程序.大型数字协程,虽然轻量级仍然是要求苛刻的应用程序中的问题

  2. 是否有async-await更优先的案例withContext

更新: Kotlin 1.2.50现在有一个可以转换的代码检查async(ctx) { }.await() to withContext(ctx) { }.

kotlin kotlin-coroutines

67
推荐指数
3
解决办法
1万
查看次数

用Java实现协同程序

这个问题与我关于Java中现有协程实现的问题有关.如果我怀疑,事实证明Java中目前没有完整的协同程序实现,那么实现它们需要什么?

正如我在那个问题中所说,我知道以下内容:

  1. 您可以在后台实现"coroutines"作为线程/线程池.
  2. 你可以在幕后用JVM字节码做一些棘手的事情,以使协同成为可能.
  3. 所谓的"Da Vinci Machine"JVM实现具有原语,使得协程可以在没有字节码操作的情况下运行.
  4. 协同程序也有各种基于JNI的方法.

我将依次解决每个人的不足之处.

基于线程的协同程序

这种"解决方案"是病态的.协同程序的重点是避免线程,锁定,内核调度等的开销.协同程序应该是轻量级的,并且只能在用户空间中执行.在具有严格限制的全倾斜螺纹方面实现它们可以消除所有优点.

JVM字节码操作

这种解决方案更实用,虽然有点难以实现.这与在C中的协同程序库中跳转到汇编语言大致相同(这是其中有多少工作),其优点是您只有一个架构可以担心并且正确.

它还将您绑定到仅在完全兼容的JVM堆栈上运行代码(例如,没有Android),除非您可以找到在非兼容堆栈上执行相同操作的方法.但是,如果您确实找到了这样做的方法,那么您现在已经将系统复杂性和测试需求翻了一番.

达芬奇机器

达芬奇机器很酷的实验,但由于它不是标准的JVM,它的功能无处不在.事实上,我怀疑大多数生产环境都会特别禁止使用达芬奇机器.因此,我可以使用它来进行很酷的实验,但不能用于我期望发布到现实世界的任何代码.

这也有类似于上面的JVM字节码操作解决方案的附加问题:将无法在替代堆栈(如Android)上工作.

JNI实施

这个解决方案在Java中实现这一点的意义重大.CPU和操作系统的每种组合都需要独立测试,每一种都是可能令人沮丧的微妙故障.或者,当然,我可以完全将自己绑定到一个平台,但这也使得用Java做事的意义完全没有实际意义.

所以...

有没有办法在不使用这四种技术之一的情况下在Java中实现协同程序?或者我会被迫使用那些闻起来最少的四个中的一个(JVM操作)?


编辑添加:

只是为了确保混乱载,这是一个相关的问题我的另外一个,但又不尽相同.那个人正在寻找一个现有的实施方案,以避免不必要地重新发明轮子.这是一个问题,如果另一个证明无法解决,将如何在Java中实现协同程序.目的是在不同的线程上保留不同的问题.

java kotlin-coroutines

63
推荐指数
3
解决办法
3万
查看次数

执行 org.jetbrains.kotlin.gradle.internal.KaptExecution &gt; java.lang.reflect.InvocationTargetException 时发生故障(无错误消息)

Android studio 报错:

Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message)
Run Code Online (Sandbox Code Playgroud)

我想在我的项目 Kotlin Coroutines 中添加并将其与 Room 数据库一起使用。但是在添加了所有库之后,我收到了这个错误。这是来自编译器的所有信息。

我已经确定,这是因为注释@Database。如果我删除此注释,则不会出现错误,但 Room 也无法正常工作。

我的gradle文件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
//apply plugin: 'androidx.navigation.safeargs'

kotlin {
    experimental {
        coroutines 'enable'
    }
}

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.bestcred.coursetthree"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        //vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-room kotlin-coroutines

63
推荐指数
8
解决办法
3万
查看次数

Kotlin Flow 与 Android LiveData

我有一些关于Kotlin Flow 的问题

  1. 我可以LiveData从多个 Fragment观察。我可以这样做Flow吗?如果是,那么如何?
  2. 我们可以使用&LiveData从单个中获得多个。有没有办法从一个来源获得多个?LiveDatamapswitchMapFlowFlow
  3. 使用MutableLiveDataI 可以使用变量引用从任何地方更新数据。有什么办法可以做同样的事情Flow吗?

我有一个用例,例如:我将观察一个SharedPreferencesusing callbackFlow{...},它会给我一个单一的源 Flow。从那个 Flow 中,我想为每个键值对创建多个 Flow。

这些可能听起来很愚蠢的问题。我是 Rx 和 Flow 世界的新手。

android kotlin android-livedata kotlin-coroutines kotlin-flow

60
推荐指数
3
解决办法
2万
查看次数

什么是暂停功能在Kotlin Coroutine中意味着什么

我正在读Kotlin Coroutine并知道它是基于suspend功能的.但是什么suspend意思呢?

协程或功能被暂停?

来自https://kotlinlang.org/docs/reference/coroutines.html

协同程序基本上是协程,可以在不阻塞线程的情况下暂停

我听说人们经常说"暂停功能".但是我认为正在等待函数完成的是协同程序被暂停?"暂停"通常意味着"停止操作",在这种情况下,协程是空闲的.

我们应该说协程被暂停吗?

哪个协程被暂停?

来自https://kotlinlang.org/docs/reference/coroutines.html

为了继续这个类比,await()可以是一个挂起函数(因此也可以从async {}块中调用),它挂起一个协同程序,直到完成一些计算并返回其结果:

async { // Here I call it the outer async coroutine
    ...
    // Here I call computation the inner coroutine
    val result = computation.await()
    ...
}
Run Code Online (Sandbox Code Playgroud)

它说"在完成某些计算之前暂停协程",但协同程序就像一个轻量级的线程.因此,如果协程被暂停,那么计算怎么办呢?

我们看到await被调用computation,所以它可能会async返回Deferred,这意味着它可以启动另一个协同程序

fun computation(): Deferred<Boolean> {
    return async {
        true
    }
}
Run Code Online (Sandbox Code Playgroud)

引述说暂停协程.它是指suspend外部的asynccoroutine,还是suspend内部的computationcoroutine?

suspend意味着当外部async协程正在wait(await …

suspend async-await kotlin kotlin-coroutines

57
推荐指数
7
解决办法
1万
查看次数

Laggy Lazy Column Android Compose

我在Jetpack Compose中创建了一个完整的应用程序。然而,其表现Lazy Column非常糟糕,而且没有任何意义。Lazy Column应该是 的替代品RecyclerView,但RecyclerView目前效果更好。

我制作了一个Lazy Column带有标题和Lazy Rows项目的项目(基本上是一个嵌套列表)。正如您所看到的,有图像,但我使用了Coil 库,因此所有内容都应该在单独的线程中加载。我已经看过这些讨论:link1link2。但似乎这个问题还没有解决方案,尽管现在Jetpack Compose已经稳定了。

你们中有人找到了获得更好性能的方法吗?还是我应该用 来Lazy Rows代替RecyclerView

这是页面的屏幕:

在此输入图像描述

android kotlin kotlin-coroutines android-jetpack-compose coil

57
推荐指数
1
解决办法
2万
查看次数