Возвращение значения из обратного вызова его родителю - PullRequest
1 голос
/ 02 апреля 2020

Мне нужно вернуть значение, полученное в результате вызова службы rest, его родителю. Проблема в том, что я звоню в службу отдыха (используя асин c класс обратного вызова), поэтому мне нужно «дождаться» результата, а затем передать его в другое место. Пожалуйста, ознакомьтесь со следующим фрагментом.

config.addC(AppController.LOCALE.getMod(),new StringC<SomeEntry>() {
public String getValue(SomeEntry object) {
            Rest.getSomething(AppController.getRest(),  object.getId(), idAccess, null, null,  new AsyncCallback<SomeStructureList>() {

                @Override
                public void onSuccess(final SomeStructureList result) {
                    return result.getSometing().getSomethingElse(); // i need to have access to variable result in the parent function getValue()
                }

                @Override
                public void onFailure(Throwable caught) {
                    // fail...
                }
            });

            return getRes(); //TODO as well
        }
});

Каков правильный способ сделать это? Заранее спасибо. РЕДАКТИРОВАТЬ: я добавил еще немного кода, чтобы сделать его более понятным.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2020

Один из способов - определить интерфейс:

public interface GetValueCallback() {
    onSuccess(SomeStructureList result);
}

Затем установить параметр обратного вызова для этого метода getValue, реализующего этот интерфейс:

public String getValue(SomeEntry object, GetValueCallback callback) {
    Rest.getSomething(AppController.getRest(),  object.getId(), idAccess, null, null,  new AsyncCallback<SomeStructureList>() {

        @Override
        public void onSuccess(final SomeStructureList result) {
            callback.onSuccess(result);
        }

        @Override
        public void onFailure(Throwable caught) {
            // fail...
        }
    });

    return getRes(); //TODO as well
}

Наконец, выполните вызов, передав обратного вызова, и вы получите результат в виде параметра:

getValue(object, new Callback() {
    @Override
    public void onSuccess(SomeStructureList result) {
        // You can do whatever you need with the result here
    }
});

Если вас интересуют другие способы, вы также можете взглянуть на Rx Java.

0 голосов
/ 02 апреля 2020

Ну, это должно go наоборот. Вы привыкли вызывать метод типа getValue, а затем что-то делать с результатом. Теперь вы должны использовать onSuccess метод, чтобы делать то, что вы хотите. При необходимости вы можете передать в качестве параметра в getValue функцию обратного вызова, которая может быть выполнена внутри метода onSuccess.

...