【Android】定位与解决anr错误记录

本文介绍了在cocos2d-x游戏项目中遇到的ANR错误定位过程,通过分析data/anr/traces.txt文件发现错误源于音效播放。注释掉相关代码后,出现OpenGL错误,原因是CCSprite未在GL线程创建。文章详细解释了Android的主线程和GL线程,并提出使用`runOnGLThread`方法在GL线程执行Lua回调以解决问题。
摘要由CSDN通过智能技术生成


问题描述


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线程中调用							
						}
					});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值