【问题标题】:AndEngine GLES 2 remove Sprite without java.lang.IndexOutOfBoundsExceptionAndEngine GLES 2 删除没有 java.lang.IndexOutOfBoundsException 的 Sprite
【发布时间】:2014-03-27 20:46:29
【问题描述】:

我有简单的 TimerHandler 可以更改替换一些 Sprite(Place 扩展 Sprite)。

我的代码

ArrayList<Place> itemsToVisit = new ArrayList<Place>();

public void Somemethod(){}
    TimerHandler effectTimer = new TimerHandler(3f, true, new ITimerCallback() {

        @Override
        public void onTimePassed(final TimerHandler pTimerHandler) {

            delegate.RequestEntity().unregisterUpdateHandler(pTimerHandler);
            updateOnEffect = new Handler(Looper.getMainLooper());
            updateOnEffect.post(new Runnable() {

                @Override
                public void run() {

                    for (Place l : itemsToVisit) {

                            if (youAreThePlace(l)) {

                                int indexForChange = itemsToVisit.indexOf(l);
                                swapPlace(l, indexForChange);
                            }

                        }
                    }
                }
            });
        }
    });
    delegate.RequestEntity().registerUpdateHandler(effectTimer);
}
public void swapPlace(Place l, int indexForChange) {
    ((Scene) delegate.RequestEntity().getParent()).unregisterTouchArea(l);
    l.detachSelf();

    l = createNewPlace(l, false);

    itemsToVisit.set(indexForChange, l);
    delegate.RequestEntity().attachChild(l);
    ((Scene) delegate.RequestEntity().getParent()).registerTouchArea(l);
}

有时它会在崩溃前工作 4 次,有时在第一次运行之后。

错误

java.lang.IndexOutOfBoundsException: Invalid index 40, size is 40
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
            at java.util.ArrayList.get(ArrayList.java:304)
            at org.andengine.entity.Entity.onManagedDraw(Entity.java:1635)
            at org.andengine.entity.Entity.onDraw(Entity.java:1398)
            at org.andengine.entity.Entity.onManagedDraw(Entity.java:1635)
            at org.andengine.entity.scene.Scene.onManagedDraw(Scene.java:259)
            at org.andengine.entity.Entity.onDraw(Entity.java:1398)
            at org.andengine.engine.Engine.onDrawScene(Engine.java:647)
            at org.andengine.engine.Engine.onDrawFrame(Engine.java:637)
            at org.andengine.opengl.view.EngineRenderer.onDrawFrame(EngineRenderer.java:105)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

我不知道我做错了什么?当我用activity.runOnUpdateThread((new Runnable() { 替换处理程序时 然后在第一次运行时我收到关于Looper.prepare()的错误

 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
            at android.os.Handler.<init>(Handler.java:121)
            at android.widget.Toast$TN.<init>(Toast.java:322)
            at android.widget.Toast.<init>(Toast.java:91)
            at android.widget.Toast.makeText(Toast.java:238)
            at pl.newaxis.szyfraki.Controller.LetterManager$1$1$1.run(PlaceManager.java:51)
            at org.andengine.engine.handler.runnable.RunnableHandler.onUpdate(RunnableHandler.java:42)
            at org.andengine.engine.Engine.onUpdateUpdateHandlers(Engine.java:617)
            at org.andengine.engine.Engine.onUpdate(Engine.java:605)
            at org.andengine.engine.Engine.onTickUpdate(Engine.java:568)
            at org.andengine.engine.Engine$UpdateThread.run(Engine.java:858)

你能告诉我我做错了什么吗?


解决

我不得不把 activity.runOnUpdateThread 唯一的项目分离。所以最后 swapPlace 看起来像这样

public void swapPlace(Place l, int indexForChange) {
    ((Scene) delegate.RequestEntity().getParent()).unregisterTouchArea(l);
    activity.runOnUpdateThread(new Runnable() {
            @Override
            public void run() {
                finalL.detachSelf();
            }
        });

    l = createNewPlace(l, false);

    itemsToVisit.set(indexForChange, l);
    delegate.RequestEntity().attachChild(l);
    ((Scene) delegate.RequestEntity().getParent()).registerTouchArea(l);
}

【问题讨论】:

    标签: java android andengine


    【解决方案1】:

    这个错误几乎总是因为 Sprite 在 updateThread 之外被删除。当您像这样删除它时,索引不会正确更新,并且下次 updateThread 尝试刷新事物时 - 缺少某些东西,因此 indexOutofBounds。

    有关如何确保删除 updateThread 上的 Sprite 的一些提示,请参阅此问题/答案 java.lang.IndexOutOfBoundsException: Invalid index 13, size is 13

    【讨论】:

    • 我认为如果我将整个 for 放在 activity.runOnUpdateThread 下它会起作用,但是,正如我之前写的那样,我得到了关于 Looper 的错误。那么正确的方式是只放l.detachSelf();呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多