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に対してのみ更新モデルを実行し、チェックされたTreeItemのシーケンスに従う必要があることです。Jobを使用する場合、どのチェック済みTreeIemが最初に処理されるかを制御できません。また、executeActionメソッド全体をジョブに入れようとしましたが、TreeItemにアクセスしているときに無効なスレッドに遭遇しました。

シーケンスを維持し、UIをフリーズさせずに新しいスレッドを起動できるように、いくつかのアイデアが必要です。

ありがとう。

4

1 に答える 1

0

あなたはこれを試すことができます。ツリーにモデルオブジェクトを収集し、そのupdateModelを別のジョブで実行します。以下のコードは実行されません。あなたはそれを少し微調整する必要があるかもしれません。

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

//ゲッター、セッターを作成します。}

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 に答える