2012-12-13 80 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