问题描写叙述

cocos2d-x游戏项目androidproject接入sdk。支付成功后,java代码回调lua方法。产生了anr。

怎样定位anr?

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluY2hhb2xvbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在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】定位与解决anr错误记录的更多相关文章

  1. Android Studio 错误: 非法字符: '\ufeff' 解决方式|错误: 须要class, interface或enum

    在导入eclipse项目到Android Studio出现这种错误, 非法字符: '\ufeff' 解决方式|错误: 须要class, interface或enum.查阅后了解到Eclipse能够智能 ...

  2. Android开发技术周报183学习记录

    Android开发技术周报183学习记录 教程 Android性能优化来龙去脉总结 记录 一.性能问题常见 内存泄漏.频繁GC.耗电问题.OOM问题. 二.导致性能问题的原因 1.人为在ui线程中做了 ...

  3. uploadify插件Http Error(302)错误记录(MVC)

    由于项目(asp.net MVC)需要做一个附件上传的功能,使用的是jQuery的Uploadify插件的2.1.0版本,上传文件到自己项目指定的文件夹下面.做完之后,在谷歌上测试是正确的,在火狐上报 ...

  4. 开发错误记录8:Unable to instantiate application com

    开发错误记录8:Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication 这是因为在And ...

  5. Android SDK代理服务器解决国内不能更新下载问题(转)

    言:Android SDK代理服务器解决国内Android SDK不能更新下载问题,经常会遇到Fitch fail URL错误,要不就是Nothing was installed.目下Google遭受 ...

  6. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  7. Android SDK代理服务器解决国内不能更新下载问题

    原文地址:http://blog.csdn.net/boonya/article/details/38752647 读者须知:本篇文章中最靠谱的是第三种方式,最近有读者反映第三种方式也不行了,下面提供 ...

  8. [转]Android 如何有效的解决内存泄漏的问题

    Android 如何有效的解决内存泄漏的问题   前言:最近在研究Handler的知识,其中涉及到一个问题,如何避免Handler带来的内存溢出问题.在网上找了很多资料,有很多都是互相抄的,没有实际的 ...

  9. kerberos 配置错误记录

    服务端错误记录: 1.服务端在创建数据库的时候报如下错误: # kdb5_util -s -r HADOOP.HOME 错误提示:kdb5_util: Improper format of Kerbe ...

随机推荐

  1. jquery操作html小技巧

    1.隐藏table整列 $("#tableID tr").find('td:eq(N)').hide();

  2. Linux学习决心书

    学习Linux决心计划书 我叫耿长学,来自河南省邓州市,经过老男孩教育运维班5个月学习后,我一定要达到的薪水目标是11000元,为了达到此目标我将采取如下10大行动或方案: 1.每天早上5:30-6: ...

  3. 一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)

    实现功能 --前面实现的代码-- 默认的对象名就类名.不符合Java的命名规范.我们希望默认的对象名首字母小写. 实现思路 创建一个命名规则的帮助类.实现将对大写开头的对象名修改为小写开头. 实现步骤 ...

  4. C#实现设置完整虚拟路径

    ){    mHttpUrl.Append(":");    mHttpUrl.Append(port);}string mServerName = "~/AppModu ...

  5. 【python】Python的单例模式

    原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...

  6. ButterKnife的使用以及不能自动生成代码问题的解决

    ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...

  7. oracle数据库创建表,序列及添加代码案例

    create table cdpt( id number(6), name varchar2(30), constraint pk_id primary key(id) ); 更改数据库的“延迟段创建 ...

  8. 这次真的忽略了一些ActiveMQ内心的娇艳

    好久没总结了,内心有点空虚了,所以今天主要给园里的朋友们分享一点儿这几天使用ActiveMQ过程中踩过的小坑,虽然说这东西简单易用,代码几行配置也就几行,问题不大但是后果有点严重,所以就要必要总结一下 ...

  9. 在ERP中定义用户时报错:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间

    在ERP中定义用户时.   报错: SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间. 原因分析: ①没有正确初 ...

  10. webpack 3.X学习之JS压缩与打包HTML文件

    js压缩 webpack自带一个插件uglifyjs-webpack-plugin来压缩js,所以不需要再次安装,当一切都准备妥当,引入uglifyjs-webpack-plugin模块: const ...