2012-01-26 8 views
2

私は以下の一般構造(コードは非常に単純化されている)持っている(私はそれに名前「ゲーマー」をあげる)ゲームを書かれている:ゲームはすべて正常に動作してアンドロイドアプリのメインスレッドはどこですか?

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()のコードを追加することによって、どちらかがメインスレッド内のどこかに私のテストやダイアログを移動することで、これを解決できると推定します。

は、誰かが容易になるだろうこれを私に伝えることができます - と必要な任意のコードがどこに行く必要があります。

答えて

2

は、メソッドを使用しようとする代わりにThreadを使用しての、あなたが使用することができますAsyncTask

+0

このコードはどこにありますか? – Mick

+0

あなたはスレッドからダイアログを表示したいので、あなたのスレッドはUIに触れたり修正したりすることができないと言いましたが、それを行うことができる唯一のスレッドはUIThreadなので、スレッドにUIを変更させますあなたのスレッドの景色、変性するビュー...など)(あなたは、UIThreadで – Houcine

+0

をそのコードを実行するために、あなたのスレッドを強制する方法のrunOnUIThread()をオーバーライドする必要がありますまたはコードは、メソッドの実行にする必要がありますあなたがAsyncTask – Houcine

0

あなたはMicksThreadThingからonDraw(canvas);を呼び出します。明らかに、アプリケーションの主なスレッドではありません。メインスレッドはアクティビティのonCreate()が呼び出されたものです。

0

通常のスレッドからUIを更新することはできません。 UIの更新にはrunOnUiThread()を使用してください。

class MicksThreadThing extends Thread 
{ 
    public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt) 
    { 
     // blah 
    } 
    public void run() 
    { 
     Gamer.this.runOnUiThread(new Runnable(){ 
     @Override 
     public void run(){ 
      //update/create your views here 
      while (this_thread_is_currently_active) 
      { 
       micks_panel_thing.updateView(); 
      } 
     } 
    }); 
    } 
} 

他の解決策は次のとおりです:、(UIThreadです)mainThread上でコードを実行するアプリを強制的にrunOnUIThread()例:

1

はこの方法でそれを実行します。

class MicksThreadThing extends Thread 
{ 
    public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt) 
    { 
     // blah 
    } 
    public void run() 
    { 
     while (this_thread_is_currently_active) 
     { 
      //micks_panel_thing.updateView(); 

      Gamer.this.runOnUiThread(new Runnable(){ 
       @Override 
       public void run(){ 
        micks_panel_thing.updateView(); 
       } 
      }); 
     } 
    } 
} 
+0

は、実行中に誤植を実行するのですか? – Mick

+0

なし... Gamer.this.runOnUiThread内部の実行が – waqaslam

+0

は、うーん...よくコードがコンパイルあなたのUIスレッドで実行されます - と私は描かれたゲームの状態を参照してください、しかし、それが凍結されている - すべてのタッチイベントに応答していません。あなたが忘れているかもしれない何か他に何かありますか? – Mick

0

メインスレッドはUIスレッドです... AsyncTaskHandlerまたはonPostExecute() or onPreexecute()を使用できます。

関連する問題