我有一个像这样的递归方法:
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。
感谢。
答案 0 :(得分: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 );
}
}