【Android】定位与解决anr错误记录
2015-03-17 09:01
465 查看
问题描述
cocos2d-x游戏项目android工程接入sdk,支付成功后,java代码回调lua方法,产生了anr。如何定位anr?
在data/anr/traces.txt文件中记录和anr错误信息。可以使用RE管理器查看该文件。
在日志信息中可以看到回调方法中调用的cocos2d-x的音频引擎播放音效的方法。就在这里产生了anr。我这里使用的是cocos2d-x2.1.5。
找到出问题的根源后,我把播放音效的代码注释了。然后再运行,就没有产生anr了。
但是,另一个问题又出现了...
报了一个OpenGL error,创建CCSprite也失败了。出现这样的问题一般是因为CCSpirte没有在GL线程中创建。
主线程与GL 线程
主线程(ui thread):app启动时创建的线程,其它线程都是该线程的子线程,主要用于更新UI的线程。GL线程:主线程的一个子线程,主要用于更新GUI的线程。在Cocos2d-x中,会从主线程中分出一个GL线程用于画面渲染相关的工作(为了保证画面的流畅)。
Android下,Activity有一个runOnUiThread方法,该方法用于在主线程中执行一个任务。注意,如果该任务比较耗时会产生anr。
方法的声明如下:
public void runOnUiThread(Runnable task);
在Android下OpenGL的渲染需要与GLSurfaceView打交道。所以Cocos2d-x封装了一个Cocos2dxGLSurfaceView。该View是与GL线程相关的。Cocos2dxActivity中包含了一个Cocos2dxGLSurfaceView,并提供一个runOnGLThread方法,该方法用于在GL线程中执行一个任务。
方法声明如下:
public void runOnGLThread(final Runnable task);
实现上是调用了GLSurfaceView的queueEvent方法实现与GL线程通信。实现机制还是Android下的消息轮询。
最后,通过runOnGLThread方法,在GL线程中回调lua方法,问题就彻底解决了。
ctx.runOnGLThread(new Runnable() { @Override public void run() { PayTools.payCallback(); //lua方法需要在GL线程中调用 } });
相关文章推荐
- android项目bug及解决方法小记录
- 使用LeakCanary快速定位解决Android内存泄漏
- Android问题解决记录—android.content.res.Resources$NotFoundException: Unable to find resource ID
- Android Toast问题解决记录
- [已解决]Delphi XE10 Android 程序引用百度定位Jar包后, 某些手机上闪退的问题
- Android ListView长按黑色背景的解决办法(个人记录)
- 快速定位解决Android内存泄漏
- 百度地图API解决 android 6.0定位不了的问题
- 百度定位 Android 经纬度出现4.9E-324 问题解决
- 解决android 6.0 动态相机相册定位权限
- Android错误解决记录
- 天天记录 - 编译Android 4.1.2源码遇到问题解决
- 彻底解决Android GPS没法定位这一顽固问题
- Android 8.0 VTS 测试 FAIL 失败项解决记录
- Android之 Eclipse NDK编译——常见错误的解决方法记录
- 如何完美的解决时间轴开发中的"绝对定位"导致的Android兼容性问题(断线,断点问题)
- Android疑难问题解决记录
- Android Eclipse - Could not find *.apk 问题解决记录
- 记录一次cefsharp1输入法在win7下异常解决定位
- 快速定位解决Android内存泄漏