0

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

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

问题是,我使用 holder 来锁定和解锁每个类中的可运行画布,并且它们都同时更新 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

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

知道如何使用不同的线程在不同时间更新表面视图吗?

4

2 回答 2

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/以获取有关消息的更多信息

于 2012-12-13T12:59:21.247 回答
0

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

问候海克·纳哈佩蒂安

于 2012-12-13T12:02:19.143 回答