博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】定位与解决anr错误记录
阅读量:6252 次
发布时间:2019-06-22

本文共 1079 字,大约阅读时间需要 3 分钟。

问题描写叙述

cocos2d-x游戏项目androidproject接入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线程中调用													}					});

你可能感兴趣的文章
走红日本 阿里云如何能够赢得海外荣耀
查看>>
HTML DOM 之 DOM对象:Document Object Model (文档对象模型)
查看>>
centos 6.5安装vncserver 并开启远程桌面
查看>>
在RHEL上配置epel的yum源及其他开源YUM源
查看>>
qt 学习之路2
查看>>
刘启成_补充知识:awk:报告生成器
查看>>
ASP.NET 使用List<T>.Remove 不生效
查看>>
TCP有限状态机
查看>>
XenServer常用Debug问题的命令介绍
查看>>
算法分析-快速排序QUICK-SORT
查看>>
Web服务基础六之编译安装配置RHEL+Apache+MySQL+PHP+ZendOptimize
查看>>
通过bat文件运行jar包程序
查看>>
关于hive RegexSerDe的源码分析
查看>>
OpenCart之侧边浮动联系我们表单(Side Contact Us Form)
查看>>
PureWhite OpenCart 商城自适应主题模板 ABC-0009
查看>>
zabbix安装配置
查看>>
CentOS 配置***客户端
查看>>
线上应用故障排查之二:高内存占用
查看>>
老毛桃 win7
查看>>
第四次作业
查看>>