sap*_*nda 3 multithreading android unity-game-engine
TLDR:我正在使用 JNI 从 Unity C# 调用我的自定义 JAR。但是android库说它在“UnityMain”线程上运行,而活动的实际ui线程称为“main”。两者有什么区别?
详细信息: 这对我来说是个问题,因为我收到错误“无法在没有调用 Looper.prepare() 的线程内创建处理程序”。这是我从 Java 打印两个线程时得到的输出:
/// Java Output
Current Thread: Thread[UnityMain,5,main]
MainLooper Thread: Thread[main,5,main]
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我使用 Activity.runOnUiThread 方法运行 JNI 调用:
/// Unity C# Code
activityObj.Call("runOnUiThread", new AndroidJavaRunnable(() => {
// JNI calls and other stuff
}
Run Code Online (Sandbox Code Playgroud)
现在,从 Java 打印两个线程时,我得到以下输出:
/// Java Output
Current Thread: Thread[main,5,main]
MainLooper Thread: Thread[main,5,main]
Run Code Online (Sandbox Code Playgroud)
现在唯一的问题是我无法从“主”线程(即在“runOnUiThread”回调中)进行 Unity Coroutine 或 Invoke 调用。我收到以下 Unity 错误:
/// Unity C# Output
E/Unity (21048): Invoke can only be called from the main thread.
E/Unity (21048): Constructors and field initializers will be executed from the loading thread when loading a scene.
E/Unity (21048): Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
Run Code Online (Sandbox Code Playgroud)
那么“UnityMain”和“main”线程有什么区别呢?为什么 Java 的“主”线程与 Unity 的不同?
小智 5
Unity 运行自己的线程来处理它的处理。它不会在启动应用程序时篡夺 Android 操作系统创建的 Android 主线程。通常,当您编写传统的 Android 应用程序时,只有一个主线程,并且所有处理 UI 的事情都必须在主线程上运行。使用第二个“主”线程是 Unity 的一个设计选择,可能是为了它可以做任何它想做的事情而不会弄乱应用程序 Android 主线程。如果你想在 Unity 之外的 Android UI 中做任何事情,你需要让你的代码在主线程上运行。您可以使用以下代码段从任何地方执行此操作:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Log.d("MAIN", "Thread? " + Thread.currentThread());
}
});
Run Code Online (Sandbox Code Playgroud)
如果您调用的 Android/Java 代码可以访问应用程序上下文或活动上下文,您也可以使用runOnUiThread。
| 归档时间: |
|
| 查看次数: |
3297 次 |
| 最近记录: |