2012-12-13 83 views
0

我開發一個的Android遊戲,我剛剛開始,所以你的答案是一種多個線程更新UI在surfaceview

我有創造,我已經實現了Runnable他們幾個班surfaceview ,並且他們從曲面視圖中獲得持有者,以便他們可以使用畫布更新曲面視圖。

問題是,我正在使用持有者鎖定和解鎖每個具有可運行類的畫布,並且他們都在同一時間更新UI,這是我不想要的。

現在所發生的事情:

12:00:00線程1個更新UI
12:00:00線程2更新UI
12:00:01線程1更新UI
12:00:01線程2更新UI
12:00:02線程1更新UI
12:00:02線程2更新UI

我真正想要的:

12:00:00線程1個更新UI
12點00分02秒2線程更新UI
12時00分03秒線程1更新UI
12時○○分07秒螺紋2更新UI
12時00分十秒線程1更新UI
12:00:15線程2更新UI

這些時間只是例子...

的我如何使用不同的線程的更新在不同的時間surfaceview任何想法?

+1

爲什麼要使用不同的線程,如果你需要他們是順序的(爲什麼不是一個線程)。另外,請看一下Java中的volatile變量。 –

+0

我需要不同的線程,因爲我將在地圖上以不同的速度移動不同的對象。好吧,我會閱讀關於易變的變量;)謝謝你的回答。 – Th3lmuu90

回答

0

它調用線程同步。如果你的線程想要更​​新UI,他應該等待另一個線程,如果這個線程正在更新。你可以搜索android thread synchronization,你會發現你想要的東西;)

問候Hayk酒店Nahapetyan

+0

我從我的代碼中刪除了「syncronized」lol雖然它會導致我的線程在同一時間更新但不是,他們仍然在等待其他人完成他們的操作...我並不是真的想這樣。 – Th3lmuu90

+0

對不起,你到底不想要什麼? –

+0

我想要兩個或更多線程在不同時間更新UI,而不是現在正在發生的時間。 – Th3lmuu90

0

你可以使用一個HandlerThread去從線程完成更新。 它的工作是這樣的:

Private final HandlerThread inboxHandlerThread; 
Private final Handler inboxHandler; 

public void onCreate(){ 
    inboxHandlerThread = new HndlerThread("inbox"); 
    inboxHandlerThread.start(); 
    inboxHandler = new Handler(inboxHandlerThread.getLooper()){ 
     @Override 
     public void handleMessage(Message msg){ 
      UIActivity.this.handleMessage(msg); 
     } 
    } 
} 

public final boolean handleMessage(Message msg){ 
    switch(msg.what){ 
    case UPDATE_Thread1: 
     someObject.setValue(msg.arg1); 
     break; 
    case UPDATE_Thread2: 
     anotherObject.setValue(msg.arg1); 
     break; 
    } 
} 

,你可以簡單地通過Message.obtain(Handler inboxHandler, int what, int arg1, int agr2).sendToTarget()

發送消息也檢查http://mindtherobot.com/blog/675/android-architecture-message-based-mvc/更多信息上的消息

+0

對不起,但我不明白這怎麼可以幫助我的問題...... :( – Th3lmuu90