首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建新线程以更新GUI

创建新线程以更新GUI
EN

Stack Overflow用户
提问于 2014-08-04 03:19:26
回答 1查看 37关注 0票数 0

我正在尝试做这个愚蠢的“游戏”,我有一个相对的布局和从View扩展的类。我创建了视图,并希望使用Thread将它们添加到相对布局中。到目前一切尚好。我让它在小对象视图向下滚动相对布局的情况下工作得很好。然后,我又添加了两个用于选项的屏幕,只有在这些屏幕之后,我才想用滚动视图显示活动。问题是它停止工作,并出现以下错误:

08-03 20:13:48.140: E/AndroidRuntime(5152):java.lang.IllegalStateException:指定的子对象已经有父对象。您必须首先在子级的父级上调用removeView()。

我不能理解这个错误...

以下是启动线程和更新UI的函数的示例代码:

代码语言:javascript
运行
复制
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    context = this.getApplicationContext();

    /*load all bitmaps*/
    loadBitmaps();

    /*get all the activities components*/
    gameCanvasRL = (RelativeLayout)findViewById(R.id.gameCanvasRL);
    playerScoreTV = (TextView)findViewById(R.id.playerPoints);

    /*GameManager instance*/
    manager = GameManager.getInstance();

    /*Start Threads*/
    startAllThreads();
}

private void startAllThreads() {
    refreshCanvasHandler = new Handler();
    spawnHandler = new Handler();

    refreshCanvasThread = new Thread(new RefreshCanvasTask());
    spawnTask = new Thread(new spawnTask());

    refreshCanvasThread.start();
    spawnTask.start();
}

class RefreshCanvasTask implements Runnable {
    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            refreshCanvasHandler.post(new Runnable() {
                @Override
                public void run() {
                    refreshCanvas();
                }
            });
        }
    }
}

private void refreshCanvas() { int germSize;

代码语言:javascript
运行
复制
    /*Move all germs*/
    manager.moveGerms();
    germSize = manager.getGerms().size();

    if(gameCanvasRL.getChildCount() > 0)
        gameCanvasRL.removeAllViews();

    for(int i = 0; i < germSize; i++) {
        gameCanvasRL.addView(manager.getGerms().get(i));
    }

}
EN

Stack Overflow用户

发布于 2014-08-04 03:23:51

该错误表示您正在尝试添加已添加到另一个视图中的视图。一个视图可能只有一个父级,因此第二次添加时会抛出异常。在将其添加到新父对象之前,您需要将其从原始父对象中删除。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25108213

复制
相关文章

相似问题

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