新しいアクティビティでブロックされたAndroid UIスレッド
-
20-12-2019 - |
質問
私は作業スレッド上のキャンバス描画を処理する小さなAndroidゲームに取り組んでいます。ゲームが終わった後、このスレッドは次のアクティビティを開始する必要がありますが、どういうわけかUIスレッドは新しい関数を開始することに
これは私のゲームのメインループです:
while(true)
// Perform Ticks until the player makes a mistake
c = _surfaceHolder.lockCanvas();
if ((toDraw = rh.performTick()) == null) {
lose();
break;
}
_surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
この関数は performTick()
ゲームロジックを処理して返します null
ゲームが終了したとき。 draw()
レンダリングを行います。両方の機能は完璧に動作します-問題は lose()
, 、これは新しい活動を開始するよりも何もしません:
protected void lose() {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(_context, MainMenu.class);
_context.startActivity(intent);
}
});
}
ゲームが終了すると、新しいActiviy(MainMenu)は正常に開始されますが、タッチイベントには反応しません。LogCat出力はなく、例外も発生しません。さらに悪いことに, lose()
メインループが開始される前に呼び出されたときに正常に動作します。
私は今何日もこれに取り組んできました。私は作業スレッドから直接活動を開始しようとしました(aを使用せずに Handler
で lose()
)と時間のためにインターネットを検索-何も助けにはなりません。UIスレッドが何らかの形でブロックされているか、無限ループに巻き込まれているようですが、これを修正する方法がわかりません。
すべてがNexus4デバイスでデバッグされます。
Btw: MainMenu.onCreate()
別の方法で起動したときに正常に動作します。
助けてください, マー-オ-マー-オ
解決
IFステートメントがTRUEの場合はキャンバスのロックを解除しません。キャンバスがロックされたままにしながら休憩を取り除きます。
while(true)
// Perform Ticks until the player makes a mistake
c = _surfaceHolder.lockCanvas();
if ((toDraw = rh.performTick()) == null) {
lose();
break;
}
// this line won't be executed whether the if statement above is true
_surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
.
IFステートメントの中にも(Lose()の前後)を解除する必要があります。
他のヒント
代わりに While(true)
あなたは持っていることができます While(myVar)
ここで myVar
ゲームが実行されている間はtrueであり、呼び出すときにfalseに設定されるブール値です lose()
あなたの場合、あなたはする必要はありませんでしたが、描き続けました。