Доброго времени суток!
Есть 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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь сделать метод по обновлению сервисаНо в ответ приходит 404 и вот такая ошибка Could not commit JPA transaction; nested exception is javax
Как сохранить в Bundle пользовательский тип данных или ArrayList<Map<String,Object>>
В каких случаях можно использовать LinkedList, на собеседованиях спрашивают где можно использовать, когда привожу примеру типа как очередь или...