を使用してRunnablesとして投稿されたメソッドに表示される、オブジェクトの状態が間違っているという非常に奇妙な問題が発生していますHandler.postDelayed
。これを使用して、2D描画の描画呼び出しをスケジュールします。この描画コードは、特定の状態フィールド(intやbooleansなど)をチェックします。
描画をスケジュールした後にこれらの状態フィールドが変更される可能性がありますが、すべてのメソッド、遅延呼び出しも同じスレッドで実行されるため(右?)、共有状態による可視性の問題はないはずです。
それでも、抽選をスケジュールする前にフラグを設定し、再度触れないため、フラグがfalse
スケジュールされた抽選にある場合は、フラグが表示されない場合があります。true
いくつかの疑似サンプルコード:
public void scheduleDraw() {
boolean flag = true;
handler.postDelayed(runnable);
}
runnable = new Runnable() {
public void run() {
// flag is false here
}
}
これはどのように起こりますか?Androidがこれらのメッセージループをどのように実装するかは完全にはわかりませんが、描画をスケジュールするメソッドとスケジュールされたメソッド自体の両方でスレッドIDを確認し、両方が同じスレッド(メインUIスレッド)で呼び出されます。
これは私を夢中にさせています、誰かが助けることができますか?
更新 この問題は、フラグが内部クラスによって1回、外部クラスによって1回チェックされていることが原因であることに気付きました。描画コードは内部クラスの一部として実行され、フラグが正しい状態であると見なされますが、外部クラスは、内部クラスのインスタンスへの参照が含まれていても、常にフラグをfalse(誤った状態)と見なします。私はまだ問題を理解していませんが、それはクラスの入れ子に関連しているようですか?