私は以下の一般構造(コードは非常に単純化されている)持っている(私はそれに名前「ゲーマー」をあげる)ゲームを書かれている:ゲームはすべて正常に動作してアンドロイドアプリのメインスレッドはどこですか?
public class Gamer extends Activity implements View.OnClickListener
{
public void onCreate(Bundle savedInstanceState)
{
mpt = new MicksPanelThing(this);
}
}
public class MicksPanelThing extends SurfaceView implements SurfaceHolder.Callback
{
public MicksPanelThing(Context context)
{
super(context);
micks_thread_thing = new MicksThreadThing(getHolder(), this);
getHolder().addCallback(this);
setFocusable(true);
}
void updateView()
{
final SurfaceHolder holder = getHolder();
try
{
Canvas canvas = holder.lockCanvas();
if(canvas != null)
{
onDraw(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void onDraw(Canvas canvas)
{
// blah
}
}
class MicksThreadThing extends Thread
{
public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt)
{
// blah
}
public void run()
{
while (this_thread_is_currently_active)
{
micks_panel_thing.updateView();
}
}
}
をし、非常に堅牢でした。今、私はある条件をテストしたいと思っていました。もしそれが本当だったら、AlertDialogを設定してください。私はこのコードを私のonDrawメソッドの中に入れることができると推測しました。私は、「Looper.prepare()を呼び出さなかったスレッド内でハンドラを作成できません」というメッセージを受け取りました。これは、onDrawメソッドがメインスレッドによって実行されていると想定しているため、混乱しています。何かを設定してください。
は、私は(どこ?)、またはどこかLooper.prepare()のコードを追加することによって、どちらかがメインスレッド内のどこかに私のテストやダイアログを移動することで、これを解決できると推定します。
は、誰かが容易になるだろうこれを私に伝えることができます - と必要な任意のコードがどこに行く必要があります。
このコードはどこにありますか? – Mick
あなたはスレッドからダイアログを表示したいので、あなたのスレッドはUIに触れたり修正したりすることができないと言いましたが、それを行うことができる唯一のスレッドはUIThreadなので、スレッドにUIを変更させますあなたのスレッドの景色、変性するビュー...など)(あなたは、UIThreadで – Houcine
をそのコードを実行するために、あなたのスレッドを強制する方法のrunOnUIThread()をオーバーライドする必要がありますまたはコードは、メソッドの実行にする必要がありますあなたがAsyncTask – Houcine