Kat*_*hen 15 multithreading android flutter
onKeyPressed我正在开发一个 Flutter 插件和一个简单的钢琴键盘布局,它在onKeyUp钢琴键时调用 Flutter 插件。钢琴应用程序可以在模拟器中运行,并且可以产生声音。但是,应用程序有时会崩溃并显示错误消息:
F/crash_dump32(22593): crash_dump.cpp:474] failed to attach to thread 185: Permission denied
Run Code Online (Sandbox Code Playgroud)
在模拟器中,会显示一个弹出警告,System UI isn't responding其中包含选项:Close the app或Wait。
如果我选择Wait,它将恢复工作,直到相同的线程错误重复出现。
在我的实现中,我有一个用 Kotlin 编写的类,它将在线程中运行:
class Synth : Runnable {
private lateinit var mThread: Thread
private var mRunning = false
private var mFreq = 440.0
private var mAmp = 0.0
private var mNumKeysDown = 0
fun start() {
mThread = Thread(this)
mRunning = true
mThread.start()
}
fun stop() {
mRunning = false
}
fun keyDown(key: Int): Int {
mFreq = Math.pow(1.0594630f.toDouble(), key.toDouble() - 69.0) * 440.0
mAmp = 1.0
mNumKeysDown += 1
return mNumKeysDown
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何Synth从 Kotlin 编写的插件中调用该类:
class PianoPlugin: FlutterPlugin, MethodCallHandler {
fun setup(plugin: PianoPlugin, binaryMessenger: BinaryMessenger) {
plugin.channel = MethodChannel(channelName)
plugin.channel.setMethodCallHandler(plugin)
plugin.synth = Synth()
plugin.synth.start() // <- Start the thread
}
Run Code Online (Sandbox Code Playgroud)
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
if (call.method == "getPlatformVersion") {
result.success(android.os.Build.VERSION.RELEASE)
} else if (call.method == "onKeyDown"){
try {
val arguments: ArrayList<Int> = call.arguments as ArrayList<Int>
val numKeysDown: Int = synth.keyDown(arguments.get(0) as Int) // <- Function call
result.success(numKeysDown)
} catch (ex: Exception) {
result.error("100", ex.message, ex.getStackTrace())
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人遇到过类似的线程问题可以分享一些可能原因的见解。非常感激!
| 归档时间: |
|
| 查看次数: |
27472 次 |
| 最近记录: |