更新:如果我首先在没有超时的情况下执行协程然后使用超时,它会起作用。但是如果我先执行一个协程 withTimeout 那么它会给我一个错误。异步也是如此。
我正在创建一个演示 kotlin 多平台应用程序,我在其中使用 ktor 执行 API 调用。我想在 ktor 请求上有一个可配置的超时函数,所以我在协程级别使用 withTimeout 。
这是我使用网络 API 调用的函数。
suspend fun <T> onNetworkWithTimeOut(
url: String,
timeoutInMillis: Long,
block: suspend CoroutineScope.() -> Any): T {
return withTimeout(timeoutInMillis) {
withContext(dispatchers.io, block)
} as T
}
suspend fun <T> onNetworkWithoutTimeOut(url: String, block: suspend CoroutineScope.() -> Any): T {
return withContext(dispatchers.io, block) as T
}
Run Code Online (Sandbox Code Playgroud)
这是我的 iOSMain 模块的 AppDispatcher 类。
@InternalCoroutinesApi
actual class AppDispatchersImpl : AppDispatchers {
@SharedImmutable
override val main: CoroutineDispatcher =
NsQueueDispatcher(dispatch_get_main_queue())
@SharedImmutable
override …Run Code Online (Sandbox Code Playgroud) 我想在 mingwX64 Windows(可能还有其他平台)上执行一些基本的文件系统操作:打开、关闭、读取、重命名、获取元数据、列出目录中的文件。
我找到了一个承诺实现此功能的项目:KotlinxIO。然而,多年来并没有取得任何进展。
还有其他替代方案或解决方法吗?
我在JetBrains FAQ 中找到了对 Kotlin/Native 内存管理模型的一些解释。
答:Kotlin/Native 提供了一种自动化的内存管理方案,类似于 Java 或 Swift 提供的方案。当前的实现包括一个自动引用计数器和一个循环收集器来收集循环垃圾。
我或多或少了解它在 Java 或 Kotlin (JVM) 中的工作原理。任何人都可以详细描述如何在使用 C 的项目中在 Kotlin/Native 中管理内存?
另外,如果有垃圾收集器,为什么我们需要 Kotlin/Native 函数 memScoped { }?
Kotlin/Native 是一种将 Kotlin 编译为无需任何 VM 即可运行的原生二进制文件的技术。从广义上讲,Native 代码是任何内存不由底层框架管理而必须由程序员自己管理的代码。即没有垃圾收集。例如 C++ 的删除和 C 的免费
我认为这与 JetBrains 常见问题解答中的内容相矛盾
使用Kotlin原生代为我们提供跨平台开发和本机可执行文件的承诺,是否有相当于Kotlin Native的Java lib Retrofit?IOW是否有一个纯粹的Kotlin网络库,它使得创建http客户端代码变得简单,并且像Retrofit对Java一样快速?
在kotlin native中有memScoped函数,当控制超出范围时,它会自动释放已分配的内存.有没有像本地对象的析构函数?
我想在 Kotlin 多平台项目中使用 kotlinx.serialization 解码包含多态类结构中的对象列表的 json 字符串,但它仅适用于 JVM,不适用于 Native。这是一个最小的可重现示例:
\n@Serializable\nabstract class Project {\n abstract val name: String\n}\n\n@Serializable\n@SerialName("BasicProject")\ndata class BasicProject(override val name: String): Project()\n\n@Serializable\n@SerialName("OwnedProject")\ndata class OwnedProject(override val name: String, val owner: String) : Project()\n\nfun main() {\n val data = Json.decodeFromString<List<Project>>("""\n [\n {"type":"BasicProject","name":"example"},\n {"type":"OwnedProject","name":"kotlinx.serialization","owner":"kotlin"} \n ]\n """))\n} \nRun Code Online (Sandbox Code Playgroud)\n这适用于 JVM,但在 Native 上会引发以下异常:
\nkotlinx.serialization.SerializationException: Serializer for class \xe2\x80\x98Project\xe2\x80\x99 is not found.\nMark the class as @Serializable or provide the serializer explicitly.\nOn Kotlin/Native explicitly declared serializer should be used for interfaces and …Run Code Online (Sandbox Code Playgroud) json kotlin json-deserialization kotlin-native kotlinx.serialization
我第一次使用 Android Studio 构建多平台项目。我创建了一个 Android 应用程序模块,该模块使用 Android 上的多平台库。我还使用 XCode 构建了一个 iOS 应用程序,该应用程序使用 iOS 上的多平台库。一切工作正常,我能够使用由不同的Android 和 iOSexpect fun实现的。actual fun
我还用 C++ 创建了一个公开 C 接口的库。
#ifndef PINGLIB_LIBRARY_H
#define PINGLIB_LIBRARY_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
long long elapsed;
} PingInfo;
typedef void (*PingCallback)(PingInfo pingInfo);
typedef struct
{
PingCallback pingUpdate;
} PingObserver;
void* ping(const char * url, const PingCallback *pingCallback);
void subscribe(void* pingOperation);
void unsubscribe(void* pingOperation);
#ifdef __cplusplus
}
#endif
#endif //PINGLIB_LIBRARY_H
Run Code Online (Sandbox Code Playgroud)
我使用 CLion 构建 C++ 代码。我创建了一个 …
我的目标是编写一个Kotlin库,将其编译为WebAssembly并从JS调用其功能。几个小时以来,我一直在努力建立一个简单的问候世界。关于此主题的文档不存在或隐藏得很好。
这是我的kotlin文件:
@Used
public fun hello() {
println("Hello world!")
}
fun main(args: Array<String>) {
println("main() function executed!")
}
Run Code Online (Sandbox Code Playgroud)
当我将其编译为WebAssembly时,会得到一个hello.wasm和hello.wasm.js文件。
首先,我尝试使用如下代码来执行该功能:
WebAssembly.instantiateStreaming(fetch('hello.wasm'), importObject)
.then(obj => obj.instance.exports.hello());
Run Code Online (Sandbox Code Playgroud)
然后,我了解到需要在importObject参数中传递来自hello.wasm.js文件的导入。所以我想我需要使用hello.wasm.js文件正确初始化wasm程序。
当像下面那样加载wasm时,没有任何错误,并且执行了main()函数。
<script wasm="hello.wasm" src="hello.wasm.js"></script>
Run Code Online (Sandbox Code Playgroud)
但是,如何从JavaScript 执行hello()函数呢?我发现的唯一Kotlin wasm示例不是调用特定函数,而是从main()函数渲染某些内容。
此外,非常感谢与相关文档的任何链接。
更新: 我设法执行了该函数,但是我不相信这是正确的方法:
<script wasm="hello.wasm" src="hello.wasm.js"></script>
<script>
WebAssembly.instantiateStreaming(fetch('hello.wasm'), konan_dependencies)
.then(obj => obj.instance.exports['kfun:hello$$ValueType']());
</script>
Run Code Online (Sandbox Code Playgroud)
问题是,如果我这样做,我的wasm文件将被提取两次。
仅加载没有wasm属性的hello.wasm.js文件会给我以下错误:
Uncaught Error: Could not find the wasm attribute pointing to the WebAssembly binary.
at …Run Code Online (Sandbox Code Playgroud) javascript kotlin webassembly kotlin-js-interop kotlin-native
与 Kotlin 多平台项目抗争 我已经结束了与 Kotlin Native一起工作时需要NsData在我的 iOS 平台上工作的问题sharedModule。
因此,我需要将objectiveC 转换NsData为KotlinByteArray并返回。我怎样才能做到这一点?
我想为 android 和 IOS 创建一个简单的多平台应用程序,这是我的常用模块配置
kotlin{
sourceSets{
commonMain{
dependencies{
implementation "org.jetbrains.kotlin:kotlin-stdlib-common:1.3.61"
}
}
}
targets {
final def iOSTarget = System.getenv('SDK_NAME')?.startsWith('iphoneos') ? presets.iosArm64 : presets.iosX64
fromPreset(iOSTarget, 'ios'){
binaries {
framework('shared')
}
}
fromPreset(presets.android, 'android')
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在通用模块中的预期界面
package common
expect interface Response{
fun submitResponse(res:Int)
}
Run Code Online (Sandbox Code Playgroud)
问题是 IDE 向我显示了响应接口的错误,expected has no actual declaration for common JVM
但我没有将 JVM 声明为预设。
这些是 android 和 IOS 的实际接口
package common
actual interface Response{
actual fun submitResponse(res:Int)
}
Run Code Online (Sandbox Code Playgroud) kotlin-native ×10
kotlin ×9
android ×1
c ×1
c++ ×1
ios ×1
javascript ×1
json ×1
ktor ×1
native ×1
retrofit ×1
webassembly ×1