这是回调的正确用法吗?

时间:2011-11-27 00:15:00

标签: java gwt

我有一个addProductButton,点击它会显示一个DialogBox,其中包含bookNameTextBoxbookCategoryTextBoxaddBookButton。点击addBookButton,它会将bookNameTextBoxbookCategoryTextBox内容插入数据库。如果成功,则应隐藏DialogBoxupdateList()

以下代码可以实现这一目标,但我不确定它是否合适,或者是否有更好的方法来实现相同的结果。

Main上课

addProductButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
    //display addBookDialogBox
    AddBookDialog abd = new AddBookDialog();
    abd.displayDialog(new Callback() {
        @Override
        public void onSuccess() {
            updateList();
        }
        public void onFailure() {               
        }
    });
}
});

public void updateList() {
}

AddBookDialog上课

public class AddBookDialog extends DialogBox {

private Callback callback;

private static AddBookDialogUiBinder uiBinder = GWT
.create(AddBookDialogUiBinder.class);

interface AddBookDialogUiBinder extends UiBinder<Widget, AddBookDialog> {
}

public AddBookDialog() {
    setWidget(uiBinder.createAndBindUi(this));
}

public void displayDialog(Callback callback2) {
    callback = callback2;
    this.center();
}

@UiHandler("addBookButton")
void onAddBookButtonClick(ClickEvent event) {
    //save book to database
    Database db = Database.openDatabase("Store", "1.0", "My Store", 5 * 1024 * 1024);
    db.transaction(new TransactionCallback() { 
        public void onTransactionStart(SQLTransaction tx) {
            tx.executeSql("INSERT INTO products (bookName, bookCategory) VALUES (?, ?)", new Object[] { bookNameTextBox.getText().toString(), bookCategoryTextBox.getText().toString() }); 
        }
         public void onTransactionFailure(SQLError error) {
         }
         public void onTransactionSuccess() {
             callback.onSuccess();
         } 
    });
    this.hide();


  }
}

Callback界面

public interface Callback {
  void onSuccess();

  void onFailure();
}

1 个答案:

答案 0 :(得分:1)

我在这里看不到它的使用,为什么不把updateList();放在onTransactionStart()方法中?

CallBacks用于Asynchronism,这里的TransactionCallback已经这样做了,所以我不明白你为什么要在里面使用另一个回调。

顺便说一下,如果你确实需要回调,为什么不使用gwt提供的AsyncCallback

编辑: 然后,适当的方法是使用updateList()方法创建一个界面。让您的主类实现它,并将displayDialog()方法的参数类型更改为您的接口类型而不是CallBack类型。