【发布时间】:2013-10-14 18:02:22
【问题描述】:
我有一些与 Android Facebook SDK 异步交互的代码。不幸的是,这意味着它返回时是在后台线程中。
Cocos-2dx 更喜欢我在主线程中与之交互,尤其是在执行诸如告诉 Director 切换场景之类的操作时(因为它涉及到 Open GL)
有什么方法可以让一些代码在主线程上运行?
【问题讨论】:
我有一些与 Android Facebook SDK 异步交互的代码。不幸的是,这意味着它返回时是在后台线程中。
Cocos-2dx 更喜欢我在主线程中与之交互,尤其是在执行诸如告诉 Director 切换场景之类的操作时(因为它涉及到 Open GL)
有什么方法可以让一些代码在主线程上运行?
【问题讨论】:
只要你有一个上下文,你就可以做这样的事情:
Handler mainHandler = new Handler(context.getMainLooper());
在 UI 线程上运行代码:
mainHandler.post(new Runnable() {
@Override
public void run() {
// run code
}
});
正如kaka建议的那样:
你也可以使用静态的Looper.getMainLooper()
返回应用程序的主循环器,它位于应用程序的主线程中。
【讨论】:
runOnUiThread(new Runnable() {
@Override
public void run() {
//execute code on main thread
}
});
【讨论】:
在 C++ 中:
Director::getInstance()->getScheduler()->performFunctionInCocosThread([]{
// execute code on main thread
});
【讨论】:
您可以通过以下两种方式在主线程中运行代码:(使用 Java 8 的 lambdas)
如果你有一个活动实例:
activity.runOnUiThread(() -> {
// do your work on main thread
});
否则使用 Handler 对象并发布 Runnable。
如果您在执行代码之前需要一些延迟,您可以使用postDelayed 版本。
Handler handler = new Handler(Looper.getMainLooper());
handler.post(() -> {
// do your work on main thread
});
【讨论】: