同じ処理でも backボタンからだとエラーとなる

 AndEngine をベースとしたアプリ「秘密のスライドパズル」では、最大32×57+4隅の1828もの Sprite を貼り付けています。
 これだけの数を貼り付けると Android 2.3.3を積む我が愛機の snapdragon 1GHz では、さすがにもたつきます。描画が遅れるのは、まあ、仕方ないですね。
 
 ところが、描画時ではなく Scene 遷移時の Sprite の除去時にエラーが出るのです。しかも、まったく同じ処理であっても、画面上のタッチイベントから処理した場合はエラーとならず、ハード上の back ボタンから処理した場合に ArrayList.throwIndexOutOfBoundsException error を吐くのです。
 具体的には、Scene 遷移時の detachChildren()、clearEntityModifiers()、clearTouchAreas()、clearUpdateHandlers()、detachSelf()、dispose() 処理時にエラーとなります。
 
 どゆこと?
 
 実は、以前のアプリにもこのエラーが出る場合もあったのですが、TimerHandler で処理タイミングずらして何となく解決していたのですね。
 今回は、Sprite 数が多いからでしょうか。タイミングずらしても確実にエラーとなり、根本的に解決しなければならないようです。
 
 エラーは「ArrayList のインデックスありませんよ」ですからね、何の ArrayList でしょう。
 ログを見るとEntity の onManagedDraw() での描画リストが処理時に空となっているからのようです。削除しているのに描画でのエラーとは、意表をつかれました。
 back ボタンからの処理時のみ描画リストがないということは、back ボタンの処理は UIスレッドで動いているのでしょうね。処理が多いときに完了を待たずに UI 別スレッドから描画処理が入るものだから、件のエラーが出ると・・・、全く確認していないのですが、そう間違ってもいないのでしょう(適当)。
 
 解決方法を Google 先生に聞いたところ、Andengine フォーラムに記事がありました。
 detach 処理を別スレッドにしてしまう方法とdetach 処理前に Engine を一時ロックしてしまう方法があるようです。う~む、別スレッドに入れて解決するのであれば、前段の仮定は間違っているということでしょうか?
 
 両方を試してみたところ、別スレッド処理は同じエラーを吐くようです。この解決方法は違う原因のエラーなのでしょうかね。英語がわかるようになりたいものです。
 
 兎にも角にも

		final EngineLock engineLock = mEngine.getEngineLock();
		engineLock.lock();
		gameScene.disposeScene(); // 子 Entity の削除やらをたっぷり処理
		gameScene = null;
		engineLock.unlock();

と、エンジンをロックして問題解決です。
 
 まだまだ知らないクラスが山ほどあるね。