多个线程在surfaceview中更新UI

时间:2012-12-13 11:57:40

标签: android multithreading user-interface surfaceview runnable

我正在开发一款安卓游戏,我刚刚开始,所以要善待你的答案

我有一个surfaceview,它创建了几个我在其上实现了Runnable的类,并且他们从surfaceview接收了holder,这样他们就可以使用画布来更新surfaceview。

问题是,我正在使用holder来锁定和解锁每个类中带有runnable的画布,并且它们都会同时更新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:00:07主题2更新UI
12:00:10主题1更新UI
12:00:15主题2更新UI

这些时间只是例子......

如何知道如何在不同时间使用不同的线程来更新surfaceview?

2 个答案:

答案 0 :(得分:0)

它正在调用线程同步。如果您的线程想要更​​新UI,他应该等待另一个线程,如果另一个线程正在更新。你可以搜索android thread synchronization,你会找到你想要的东西;)

关心Hayk Nahapetyan

答案 1 :(得分: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/以获取有关消息的更多信息