相关疑难解决方法(0)

Kotlin暂停了乐趣

我有Kotlin界面

interface FileSystem {
    suspend fun getName(path: Path): List<String>
}
Run Code Online (Sandbox Code Playgroud)

我怎么能用Java调用它?什么是

Continuation <? super List<String>>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

kotlin kotlin-coroutines

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

如何从Java 7中调用Kotlin暂停协程功能

我正在尝试从Java 7调用Kotlin函数.我正在使用协同程序,这个被调用的函数正在挂起,例如:

suspend fun suspendingFunction(): Boolean {
    return async { longRunningFunction() }.await()
}

suspend fun longRunningFunction() : Boolean {
    delay(400)
    return true
}
Run Code Online (Sandbox Code Playgroud)

我在版本0.25.3中使用协同程序,我可以通过将Continuation<U>实例作为参数传递给挂起函数来模拟简单的Java回调样式,例如

CoroutinesKt.suspendingFunction(new Continuation<Boolean>() {
    @Override
    public CoroutineContext getContext() {
        return EmptyCoroutineContext.INSTANCE;
    }

    @Override
    public void resume(Boolean value) {
        doSomethingWithResult(value);
    }

    @Override
    public void resumeWithException(@NotNull Throwable throwable) {
        handleException(throwable);
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,在更新到完全稳定的1.0.1版本后,我认为它已不再可能.假设暂停函数的更新版本如下所示:

suspend fun suspendingFunction(): Boolean {
    return GlobalScope.async { longRunningFunction() }.await()
}
Run Code Online (Sandbox Code Playgroud)

Continuation<U>现在使用Result类,它似乎无法从Java中使用(这是有意义的,因为它是内联类).我试图使用Continuation协同程序的一些子类,但它们都是内部或私有的.

我知道通常建议将协程转换为CompletableFuture,但我在Android上,这意味着只有Java 7.Future另一方面,简单是太愚蠢,因为我不想定期检查函数是否完成 …

java android coroutine kotlin kotlinx.coroutines

7
推荐指数
2
解决办法
2516
查看次数

从 Java 代码访问 kotlin Suspend 函数

我有 Room 数据库接口,它是一个 Kotlin 文件,因为我不希望调用在主线程上运行,所以我使用 kotlin Suspend。我怎样才能使用java中的挂起函数

我有两种方法,我想插入一个User和另一个来检索用户

这些是我在 java 文件中遇到的错误

在此输入图像描述

代码

Room Dao接口

用户道

@Dao
interface UserDao {

    fun getAllUsersAsync(): CompletableFuture<List<User>> =
        GlobalScope.future { getAllUsers() }

    @Query("SELECT * FROM user")
    suspend fun getAllUsers(): List<User>

    @Insert
    suspend fun insertUser(user: User): Long
}
Run Code Online (Sandbox Code Playgroud)

Java代码

private Long addUser(com.i6systems.in2plane.AppDatabase.User user) {
    return userDao.insertUser(user);
}

private List<com.i6systems.in2plane.AppDatabase.User> getUsers () {
    return userDao.getAllUsersAsync();
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助

谢谢R

android kotlin android-room kotlin-coroutines

5
推荐指数
0
解决办法
5029
查看次数