Android 创建新线程以更新GUI

Android 创建新线程以更新GUI,android,Android,我试图做这个愚蠢的“游戏”,我有一个相对的布局和类,从视图扩展。我创建视图,并希望使用线程将它们添加到相对布局中。到现在为止,一直都还不错。我让它工作得很好,小对象视图沿着相对布局向下滚动。然后,我又添加了两个选项屏幕,只有在这些屏幕之后,我才想用滚动视图显示活动。问题是它停止工作时出现以下错误: 08-03 20:13:48.140:E/AndroidRuntime(5152):java.lang.IllegalStateException:指定的子级已具有父级。必须首先对子级的父级调用rem

我试图做这个愚蠢的“游戏”,我有一个相对的布局和类,从视图扩展。我创建视图,并希望使用线程将它们添加到相对布局中。到现在为止,一直都还不错。我让它工作得很好,小对象视图沿着相对布局向下滚动。然后,我又添加了两个选项屏幕,只有在这些屏幕之后,我才想用滚动视图显示活动。问题是它停止工作时出现以下错误:

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

我不能理解这个错误

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

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();
                }
            });
        }
    }
}
私有void刷新画布(){ 内胚芽大小

    /*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));
    }

}
/*移动所有细菌*/
manager.moveGerms();
germSize=manager.getGerms().size();
如果(gameCanvasRL.getChildCount()>0)
gameCanvasRL.removeallview();
for(int i=0;i
该错误表示您正在尝试添加已添加到另一个视图中的视图。一个视图可能只有一个父视图,因此第二个add会引发异常。在将其添加到新的父项之前,您需要将其从原始父项中删除。

您建议如何操作?在哪里?问题是,在清单中,当我把这个活动作为主要活动时,它工作得很好。如果我开始这项活动的目的是它停止工作=/