Это правильное использование обратного вызова? - PullRequest
1 голос
/ 27 ноября 2011

У меня есть addProductButton, щелкните по нему, и он вызовет DialogBox, содержащий bookNameTextBox, bookCategoryTextBox и addBookButton.Нажмите addBookButton, он вставит содержимое bookNameTextBox и bookCategoryTextBox в базу данных.В случае успеха, он должен скрыть DialogBox и updateList()

Следующий код работает для достижения этой цели, но я не уверен, что это правильно или есть лучший способ достичь тех же результатов.

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 Ответ

1 голос
/ 27 ноября 2011

Я не вижу здесь его использования, почему бы вам просто не поместить updateList(); в метод onTransactionStart()?

CallBacks используются для асинхронизма, и TransactionCallback здесь уже делает это, поэтому я не понимаю, почему вы бы использовали другой обратный вызов внутри.

И, кстати, если вам нужен обратный вызов, почему бы вам не использовать AsyncCallback , предоставленный gwt?

РЕДАКТИРОВАТЬ: Тогда соответствующим способом является создание интерфейса с вашим методом updateList().Сделайте так, чтобы ваш основной класс реализовал это, и измените тип параметра вашего displayDialog() метода на ваш тип интерфейса вместо типа CallBack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...