2012-01-07 12 views
0

ハロー、Androidおよびスレッディング

私は1つのFrameLayoutでレイアウトされたアクティビティを持っています。このレイアウトに追加されたViewを継承するクラスがあります。

ゲームループのように、このビューに引き続き描画したいと考えています。

問題は、私は、メインUIスレッドにいる場合を除き

私は本当にレイアウトを更新できません..私はAndroidに新たなんだと、このスレッドのようなものは何も意味を作っていないのですか? スレッドを初期化するにはどうすればよいですか? :(

EDIT ::主な活動でそれを初期化するために、これは私が作ってみたものですが、それは何で私のフレームを更新しません

public class GameFrame extends View 
    { 
     private GameThread m_gt; 

     public GameFrame(Context context, int width int height){ 
       //do some initialisation stuff 
     } 

     public GameThread getGameThread(){ 
       if(m_gt != null){ 
        return m_gt; 
       }else{ 
        m_gt = new GameThread(this); 
        return m_gt; 
       } 
     } 
     @Override 
     public void onDraw(Canvas canvas){ 
       //Draw loads of stuff 
     } 

     public class GameThread extends AsyncTask<Void, Void, Void> 
     { 

      private GameFrame m_gf; 

      public GameThread(GameFrame gf){ 
       m_gf = gf; 
      } 

      @Override 
      protected void onProgressUpdate(Void... arg0){ 
       System.out.println("Wahoo"); 
       m_gf.invalidate(); 
      } 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       long start, end; 
       while(some bool){ 

        System.out.println("Threadin'"); 

        publishProgress(); 

        //Fiddle with some values 
       } 
       return null; 
      } 

     } 
    } 

そして:。

private FrameLayout frame; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    ... 

    frame = (FrameLayout) findViewById(R.id.gameframe); 
    GameFrame gf = new GameFrame(this, width, height); 

    frame.addView(gf); 
    gf.getGameThread().execute(); 
} 

私はおそらく、プリントアウト「ワフー」と「スレッド」と言うべきか。この作品はonDrawで有効なコードを特定すべきか?非同期の私の理解は正しいです何かので何回もプリントアウトされています右に起こっている必要があります。それは「ワフー」を印刷したより決定的ならば、確かにそれは、次の私のビューを再描画する必要があります...が、何も起こりません:(

+0

)あなたはasynctaskが走っている間に、メインUIを更新し続けたい場合は、あなたがpublishProgress(経由でこれを行うことができますthisチェックアウト、コメントで言ったように、スレッドはまた

を走った後、キャンバスを描く必要があります。[this](http://developer.android.com/guide/topics/graphics/2d-grap)を参照してください。 hics.html)記事。 – clemp6r

答えて

1

を使用AsyncTask

これはあなたが前にメインUIを更新するための2つの方法がありますトムはあなたが

+1

OPが継続的にUIを更新したいと思うので、オーバーライドするメソッドはhttp://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress ...)ですAsyncTaskのバックグラウンドスレッドのライフタイム(publishProgress()経由)中にUIを継続的に更新します。 –

+0

良い提案@TomDignan Illはこれで私の答えを更新します。 –

+0

答えをいただきありがとうございます。私たちは同じページにいるようです。私はこれらのジェネリックが何を見ているかを完全には理解していませんが。私はpublishProgress(Progress ...)で何を送るでしょうか。私はビューの瞬間にonDrawをオーバーライドしていることを覚えておいてください。かなりの更新があります。または、それはonProgressUpdate(){invalidate();という簡単なことですか? } –

関連する問題