2012-01-07 41 views
0

你好,Android和線程

我有一個活動,其佈局是由一個FrameLayout組成。我有一個擴展View的類,然後添加到這個佈局。

我想不斷吸取這個觀點,就像在遊戲循環中一樣。

問題是,我是新來的Android和該線程的東西正在沒有意義..

能,除非我的主UI線程我我真的不更新佈局? 我如何着手初始化線程? :(

編輯::這是我所想出的,但它並沒有更新我與任何框架

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

你這樣做應該通過畫布繪製。請參閱[this](http://developer.android.com/guide/topics/graphics/2d-grap hics.html)文章。 – clemp6r 2012-01-07 10:26:45

回答

1

您使用AsyncTask

這有兩個方法,讓之前更新主UI和線程後已經跑

而且湯姆在評論說,如果你想繼續,而的AsyncTask正在地跑更新的主界面,檢查出this您可以通過publishProgress()

+1

這聽起來像OP想不斷更新用戶界面,所以我認爲他應該重寫的方法是http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress ...),它可以讓您在AsyncTask後臺線程的生命週期中不斷更新UI(通過publishProgress()) – 2012-01-07 03:39:19

+0

好的建議@TomDignan我用這個更新了我的答案。 – 2012-01-07 03:40:59

+0

感謝您的回答,我們似乎在同一頁上。雖然我不完全理解這些泛型是什麼。我會在publishProgress(Progress ...)中發送什麼內容?請記住,我現在在視圖上壓倒onDraw,並且有很多更新正在繪製中。或者它會像說onProgressUpdate(){invalidate(); } – 2012-01-07 04:10:21