首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表面视图中的多线程更新UI

表面视图中的多线程更新UI
EN

Stack Overflow用户
提问于 2012-12-13 19:57:40
回答 2查看 900关注 0票数 0

我正在开发一个android游戏,我才刚刚开始,所以请友好地回答我的问题

我有一个表面视图,它创建了几个类,我已经在它们上实现了Runnable,它们从表面视图接收holder,这样它们就可以使用画布来更新表面视图。

问题是,我使用holder和runnable在每个类中锁定和解锁画布,它们都同时更新UI,这是我不想做的事情。

现在发生的事情:

12:00:00线程1更新UI

12:00:00线程2更新UI

12:00:01线程1更新界面

12:00:01线程2更新界面

12:00:02线程1更新界面

12:00:02线程2更新界面

我真正想要的是:

12:00:00线程1更新UI

12:00:02线程2更新界面

12:00:03线程1更新界面

12:00:07线程2更新界面

12:00:10线程1更新UI

12:00:15线程2更新UI

这些时间只是一些例子。

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

EN

回答 2

Stack Overflow用户

发布于 2012-12-13 20:02:19

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

问候海克·纳哈佩特扬

票数 0
EN

Stack Overflow用户

发布于 2012-12-13 20:59:21

您可以使用HandlerThread从线程中获取要完成的更新。它的工作原理如下:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13859362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档