zoukankan      html  css  js  c++  java
  • 【Android】定位与解决anr错误记录


    问题描写叙述


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

  • 相关阅读:
    9种纯CSS3人物信息卡片动态展示效果
    CSS3 animation属性 实现转动效果
    炫酷CSS3垂直时间轴特效
    css实现翻面效果
    uniapp上传图片转base64码
    经常使用的js三元表达式
    async/await 使用
    Python的OS模块批量修改文件名
    解决Tomcat对POST请求文件上传大小的限制
    HTTP 413错误解决方法
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7120667.html
Copyright © 2011-2022 走看看