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

问题描述

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线程中调用
						}
					});
时间: 2024-11-04 15:25:59

【Android】定位与解决anr错误记录的相关文章

android studio 1.4 开发错误记录 -不断更新

记录开发中遇到的问题,不断更新 1.AVD模拟器启动卡在android界面: 原因:手动设置了internal storage大小. 创建模拟器时internal storage不要修改,否则启动不了:即使启动的了,修改的容积也不会发生变化. 即看配置的时候已经变成例如1G,实际上启动起来到adroid系统中看还是默认的200m. 2.空间不足:Android avd internal storage 不足 默认空间只有200m,实际可用的更少,装几个程序就不够用了. 解决方法:扩容 方法1:命

Android 开发遇见的所有错误记录

1. FATAL EXCEPTION: AsyncTask #1 doInBackground() 原因:select语句拼写错误 如:String select = "((" + Contacts.DISPLAY_NAME + "NOTNULL ) AND (" + Contacts.DISPLAY_NAME + " != '' ))";将会报错 FATAL EXCEPTION: AsyncTask #1 doInBackground() 修改

Android 笔记之错误记录

前言--好记性不如烂笔头,记录Android学习过程中遇到的各种问题BUG.O(∩_∩)O 错误1 -- Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0 错误原因--一般是int 型数据赋给String ,然后让TextView显示就会出现如上错误. 解决办法--用String.valueOf 或者在int数据后加"" 错误2-- 在布局文件中,文本的设置使用如下写法

Android使用百度定位SDK 方法及错误处理

之前我的项目中的位置定位使用的是基站方法,使用的Google提供的API,但是前天中午突然就不返回数据了,到网上搜了一下才知道,Google的接 口不提供服务了,基于时间紧迫用了百度现有的SDK,但是在使用过程中第一次获取位置总是空值,经过多次实验终于成功.当然,如果需要精确的位置,你可以 再加上位置偏移算法.我的应用对这个要求不高,就没做,一搜一大把,就不多说了. 下面这段话来自 百度地图API>定位SDK 百度地图定位SDK免费对外开放,无需申请key.在使用百度定位SDK前,希望先阅读百度

黑暗世界错误记录(待解决)

启动startmaster.py错误 ImportErrorImportErrorImportErrorImportError: : : : NNNNo module named affinityo module named affinityo module named affinityo module named affinity unity3d调试错误 --------- beginning of /dev/log/system--------- beginning of /dev/log/

Android 导入v7包常见错误,以及项目引用v7包错误解决,androidv7

Android 导入v7包常见错误,以及项目引用v7包错误解决,androidv7 android下v4    v7   v21等包是android系统的扩展支持包,就想windows的系统补丁一个道理. android的扩展包主要是用来兼容低版本的,比如android3.0以后出现了actionbar,如果要使用actionbar,那么手机系统必须在3.0以上才能使用,这样将会导致很多用户不能安装apk从而损失用户:(有人会想,为什么不直接将新出来的东西全部打包到sdk中而是提供各种支持包?我

android 关于InputDispatcher出现Consumer错误的解决办法

原地址:http://www.educity.cn/wenda/158744.html android 关于InputDispatcher出现Consumer异常的解决方法10-23 03:24:46.346: ERROR/InputDispatcher(61): channel '40774ac8 coinv.panfa/coinv.panfa.activities.MeinvFlashActivity (server)' ~ Consumer closed input channel or

理解ANR的前世今生,解决ANR就是这么简单!

1. 什么是ANR? ANR(Application Not Responding)即应用程序无响应. 2. ANR产生的原因是什么? ANR产生的根本原因是APP阻塞了UI线程.在android系统中每个App只有一个UI线程,是在App创建时默认生成的,UI线程默认初始化了一个消息循环来处理UI消息,ANR往往就是处理UI消息超时了.那么UI消息来源有哪些呢?主要有两种来源: 2.1 来自于AMS的回调消息 在Android系统中,应用程序是有Android的四大组件组成,AMS负责对应用程

Android NDK开发(三)——常见错误集锦以及LOG使用

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错