java – 在Cocos2dx中的主/ UI线程上运行代码
编辑:所以问题出在
Java方面.购买完成的听众没有被调用.这非常有用:
IabHelper PurchaseFinishedListener
我的Cocos2dx游戏在大多数情况下在Android和iOS上运行良好.只考虑给我带来麻烦的是Android In-App Billing. 我正在使用JNI从C调用Java. Java代码在Google Play结算系统中来回传递,最终回拨C代码,指示给用户多少钱(成功购买金额). 从Java回到C的调用正在做一些非常奇怪的事情.运行的C代码应该更新两件事的显示.但是它只更新一个而且不一致.此外,从Java到C的多次调用导致CCNodes忽略触摸并执行其他奇怪的操作. 在阅读了类似的问题之后,我意识到Java或C调用可能不在主/ UI线程上.所以我试着解决这个问题: // Java code IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase,IabResult result) { if (result.isSuccess()) { String sku = purchase.getSku(); if (sku.equals(IAB_ID_ABC)) { me.runOnUiThread(new Runnable() { public void run() { callCppMethodFromJava_giveUserABC(); } }); } } }; 这里我试图在main / UI线程上调用giveUserABC. giveUserABC被调用但是它表现出如上所述的奇怪行为. 我尝试的另一件事是在giveUserABC中通过CCNotificationCenter发布通知.这是一个在黑暗中拍摄但我读到它在某个地方工作的人. 不幸的是,这并没有解决这种奇怪的行为.非常感谢任何理解和解决这种情况的帮助! 解决方法
根据我的经验,你应该在GLThread上运行它:
me.runOnGLThread(new Runnable() { public void run() { callCppMethodFromJava_giveUserABC(); } }); 我们知道,UiThread是Android应用程序的主线程,而Cocos2dxGLSurfaceView通常在GL thrread上运行. 因此,如果要从Java调用C,则应在GL线程中调用它.在从C调用Java时,通常应该在Ui线程中调用它.在大多数情况下,根据我的经验是正确的. 有关更多信息,runOnGLThread方法不是Android的api,它是在cocos2d-x项目中实现的org.cocos2dx.lib.Cocos2dxActivity.java. 从源代码中,您可以轻松找到,使用Cocos2dxGLSurfaceView.getInstance().queueEvent()而不是this.runOnGLThread()也可以. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |