Доброго времени суток!
Есть MainActivity, java класс, который отправляет запрос в сеть и получает оттуда ответ. Работает все так:
1.MainActivity -> 2.LClass -> 3.Internet -> 4.LClass -> 5.MainActivity
Вызываю метод в LClass
Посылаю запрос на сервер
Принимаю через несколько миллисекунд ответ
Отправляю ответ в MainActivity
Выполняю определенный код
Моя проблема в том, что не могу написать правильный callback, который бы решил мой вопрос.
Читал уроки в сети по callback'ам - ничего не понял.
Если по простому колбек это, когда не ты вызываешь метод(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!
Разобрался. Код будет следующим:
DataInterface
public interface DataInterface {
void getDataInterface(List dataList);
void getOnFailureMessage(String failureMessage);
}
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);
}
// методы класса
}
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
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости