0

我有一个这样的递归方法:

    protected void executeAction( TreeItem ti )
{
    boolean isChecked = ti.getChecked();

    if ( isChecked )
    {
        Somedata data = (SomeData) ti.getData();
        String action = data.getSelectedAction();
        ActionManager am = data.getActionManager();
        AbstractActionAgent agent = am.getAction( action );
        if ( agent != null )
        {                
            agent.updateModel( data );   //Makes a server trips and long computation               
        }
    }
    int itemcnt = ti.getItemCount();
    TreeItem[] childTrees = ti.getItems();

    for ( int i = 0; i < itemcnt; i++ )
    {
        executeAction( childTrees[i] );
    }
}

我的 updateModel 方法冻结了 UI,所以我尝试使用 Job,但我的问题是我希望只为选中的 TreeItem 执行更新模型,它应该遵循选中的 TreeItems 的顺序。如果我使用 Job,我无法控制首先处理哪个选中的 TreeIem。我还尝试将整个 executeAction 方法放在一个 Job 中,但在访问 TreeItem 时遇到了无效线程。

我需要一些想法,以便我可以在保持顺序而不冻结我的 UI 的同时创建一个新线程。

谢谢。

4

1 回答 1

0

你可以试试这个。在树中收集模型对象并在单独的作业中运行该 updateModel。下面的代码不运行。你可能需要稍微调整一下。

  class Node {
    private SomeData nodeData;
    private List<Node> children = new ArrayList();

// 创建 getter, setter.. }

protected void executeAction( TreeItem ti, Node parentNode ) {
boolean isChecked = ti.getChecked();
Node n = null;
if ( isChecked )
{
    Somedata data = (SomeData) ti.getData();
    if (parentNode != null) {
       n = new Node();
       n.setNodeData(data);
       parentNode.addChild(n);
    }

}
int itemcnt = ti.getItemCount();
TreeItem[] childTrees = ti.getItems();

for ( int i = 0; i < itemcnt; i++ )
{
    executeAction( childTrees[i],n );
}

}

于 2012-05-14T07:16:28.833 回答