BaseGameActivity.runOnUpdateThread() 与 Entity.registerUpdateHandler()

2024-04-01

如果我执行有什么区别Runnable with runOnUpdateThread()或者我将更新处理程序注册到实体中并用它执行代码?

我想删除一个Sprite从场景Sprite.detachSelf()。在这种情况下,教程说必须在更新线程中调用此方法BaseGameActivity.runOnUpdateThread()。但是通过这个解决方案,我必须将活动对象传递给每个想要使用的对象runOnUpdateThread()。嗯...我不喜欢它。

我的问题是如果我创建一个RunnableHandler实体中的对象并将其注册到registerUpdateHandler()并将新的 Runnable 添加到RunnableHandler,这个解与runOnUpdateThread()功能。这是Runnable在更新线程中执行?

/* MySprite is attached to a Scene object */
public class MySprite extends Sprite {
   private final RunnableHandler UPDATE_HANDLER = new RunnableHandler();

   public MySprite() {
       registerUpdateHandler(UPDATE_HANDLER);
   }

   /* called when the sprite has to be removed from scene */
   public void removeMyself() {
       Runnable r = new Runnable() {
           public void run() {
               detachSelf();
           }
       };
       UPDATE_HANDLER.postRunnable(r);
   }
}

我问这个是因为使用标准解决方案一切正常。但通过更新处理程序解决方案,我得到了这个异常:

致命异常:UpdateThread java.lang.IndexOutOfBoundsException:无效索引 19,大小为 19 在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 在 java.util.ArrayList.get(ArrayList.java:308) 在 org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402) 在 org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284) 在 org.andengine.entity.Entity.onUpdate(Entity.java:1167) 在 org.andengine.engine.Engine.onUpdateScene(Engine.java:591) 在 org.andengine.engine.Engine.onUpdate(Engine.java:586) 在 org.andengine.engine.Engine.onTickUpdate(Engine.java:548) 在 org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)

它通常在调用附加/分离函数时出现not在更新线程中。我对吗? 预先感谢您的帮助。


查看源代码中Entity https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1400理论上发生的情况是:

  1. 显示的行选取实体计数 = 19(来自日志)
  2. 其中一个entity.get(i).onUpdate() 调用removeMyself()
  3. detachSelf 的可运行程序已排队。
  4. 下一个entity.get(i).onUpdate()将导致UpdateHandler通过以下方式运行onUpdate https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1165(更新处理程序在 onManagedUpdate 中运行)
  5. the 分离自我 https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L705从父列表(调用者)中删除子项(其中条目计数仍为 19,但 mChildren/entities 的长度现在为 18)

只是查看代码的理论......我认为开始获得答案的一个好点是查看循环Entity https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1400并查看“实体”在循环期间是否被修改。 (注意:“最终实体”只是防止重新分配变量,而不是修改列表)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BaseGameActivity.runOnUpdateThread() 与 Entity.registerUpdateHandler() 的相关文章

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 如何清除所有WebView存储的信息?

    我有一个 Android 浏览器 我可以选择清除缓存 存储 cookie 等 代码如下所示 webView clearCache true webView clearFormData webView clearHistory webView
  • 在包“android”中找不到属性“backgroundTint”的资源标识符

    我发现了一些视图 xml 属性 例如backgroundTint backgroundTintMode 但是当我使用它作为视图属性定义时 Eclipse 显示错误 No resource identifier found for attri
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • 如何使用 Cordova 获取当前安装的应用程序的版本?

    我已经找到了应用程序可用性插件 https github com ohh2ahh AppAvailability它主要检查用户是否在其设备上安装了某个应用程序 是否有可能获得应用程序的当前版本 开发者名称 重要 以及所有可能的信息 一般来说
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何发布Android .aar源以使Android Studio自动找到它们?

    我正在将库发布到内部 Sonatype Nexus 存储库 Android Studio 有一个功能 可以自动查找通过 gradle 引用的库的正确源 我将 aar 的源代码作为单独的 jar 发布到 Nexus 但 Android Stu
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时

随机推荐