Callback в Activity

168
21 марта 2018, 05:06

Доброго времени суток!

Есть MainActivity, java класс, который отправляет запрос в сеть и получает оттуда ответ. Работает все так:

1.MainActivity -> 2.LClass -> 3.Internet -> 4.LClass -> 5.MainActivity

  1. Вызываю метод в LClass

  2. Посылаю запрос на сервер

  3. Принимаю через несколько миллисекунд ответ

  4. Отправляю ответ в MainActivity

  5. Выполняю определенный код

Моя проблема в том, что не могу написать правильный callback, который бы решил мой вопрос. Читал уроки в сети по callback'ам - ничего не понял.

Answer 1

Если по простому колбек это, когда не ты вызываешь метод(new SomeClass().someMethod()), а у тебя вызовут метод. Сразу вопрос, кто его должен вызвать? Так вот вызовет, тот обьект на которого ты подписан. Пример: Ты едешь в автобусе. Если использовать первый вариант, то тебе придется самому опрашивать кондуктора можно ли ему заплатить за проезд. При использовании колбека ты заходя в автобус регистрируешся, как человек, который хочет заплатить за проезд. Так вот тебе постоянно опрашивать теперь кондуктора не нужно. Когда придет нужное время, кондуктор сам вызовет у тебя метод взятьДеньгиЗаПроезд() Изходя из вышенаписаного сделай класс LClass слушателя и MainActivity подписчиком, и зарегистрируй MainActivity у LClass. Как это сделать есть куча примеров в инете, почитай про observer и listener

public class Subscriber implements Listener {
    @Override
    public void onEvent() {
        System.out.println("I've been called!");
    }
}
interface Listener {
    void onEvent();
}
class EventCatcher {
    private List<Subscriber> subscribers = new ArrayList<>();
    public void addSubscriber(Subscriber subscriber) {
        subscribers.add(subscriber);
    }
    public void removeSubscriber(Subscriber subscriber) {
        subscribers.remove(subscriber);
    }
    public void catchEvent() {
        System.out.println("Event happened!");
        for (Subscriber subscriber : subscribers) {
            subscriber.onEvent();
        }
    }
    public static void main(String[] args) {
        Subscriber subscriber = new Subscriber();
        EventCatcher eventCatcher = new EventCatcher();
        eventCatcher.addSubscriber(subscriber);
        System.out.println("Event is coming!");
        eventCatcher.catchEvent();
    }
}

Output:

Event is coming!
Event happened!
I've been called!

Answer 2

Разобрался. Код будет следующим:

  1. Создаем интерфейс DataInterface
public interface DataInterface {
    void getDataInterface(List dataList);
    void getOnFailureMessage(String failureMessage);
}
  1. В существующей активити MainActivity пишу
// вариант #1
public class MainActivity extends AppCompatActivity {
    // методы класса
    private DataInterface dataInterface = new DataInterface() {
        @Override
        public void getDataInterface(List dataList) {
            // здесь делаю все, что мне нужно с dataList
        }
        @Override
        public void getOnFailureMessage(String failureMessage) {
            // здесь обрабатываю ошибки, которые могут возникнуть при работе с сетью
        }
    };
    // к примеру, ВЫЗОВ будет в onCreate() activity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_main);
        GetData.getData(dataInterface);
    }
    // методы класса
}
  1. В java классе, который работает с Retrofit 2 пишу в методе onResponse()
public class GetData {
    public static void getData(final DataInterface dataInterface) {
    @Override
    public void onResponse(...., @NonNull Response response) {
        if (response.isSuccessful() && response.body() != null) {
            List data = response.body().getData();
            dataInterface.getDataInterface(data);
        }
    }
    @Override
    public void onFailure(... , @NonNull Throwable t) {
        dataInterface.getOnFailureMessage(t.toString());
    }
}

Вот и все! Оказалось проще простого! Будет в сети теперь +1 адекватный пример кода

// Везде в коде вместо List dataList прописан List<Data> dataList

READ ALSO
Ошибка при PUT-методе

Ошибка при PUT-методе

Пытаюсь сделать метод по обновлению сервисаНо в ответ приходит 404 и вот такая ошибка Could not commit JPA transaction; nested exception is javax

161
Как в onSaveInstanceState() сохранить пользовательский объект

Как в onSaveInstanceState() сохранить пользовательский объект

Как сохранить в Bundle пользовательский тип данных или ArrayList<Map<String,Object>>

133
Реальный пример использования LinkedList

Реальный пример использования LinkedList

В каких случаях можно использовать LinkedList, на собеседованиях спрашивают где можно использовать, когда привожу примеру типа как очередь или...

201
Запуск объекта на постоянную работу?

Запуск объекта на постоянную работу?

Подскажите, как можно реализоватьЕсть переключатель

110