Отправка данных во фрагменты после их загрузки с помощью Async Http
Я разбираю JSON
с Async Http
в деятельности. Однажды, когда данные успешно проанализированы, я хочу, чтобы они были доступны обоим фрагментам, которые содержит действие. Один фрагмент ListView
отображение загруженных данных, а другой Google MapView
отображение данных - не то, чтобы это имело значение.
Как только данные загружены:
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
// Data downloaded
}
Я хочу отправить его обоим fragments
и обновить карту и ListView
с данными.
Так что я как-то хочу реализовать своего рода слушателя в обоих этих фрагментах, которые будут слушать "onSuccess"
произойти, а затем использовать данные, которые он получил.
Так что если onSuccess
произошло раньше Fragments
даже созданные экземпляры, они будут мгновенно отображать данные. Если нет, они будут ждать этого.
Может ли кто-нибудь помочь мне реализовать это? Я не знаю, как именно к этому подойти.
4 ответа
У вас есть эти варианты:
- Используйте EventBus и отправьте данные обоим фрагментам
- Сохраните данные в действии, используйте LocalBroadcasrManager и отправьте широковещательную рассылку, которая позволит фрагментам знать, что данные были загружены, и получать доступ к данным из фрагментов, т.е.
((MyActivity)getActivity()).getData();
Локальная трансляция сообщения будет соответствовать этому сценарию.
Следующие пункты также будут полезны для вас.
- создавать экземпляры фрагментов после получения данных и передавать их через метод setArgument(Bundle) (если выборка ответа выполняется один раз)
- Если данные в onSucces() поступают периодически, то реализуйте свой собственный метод для обновления пользовательского интерфейса как фрагмента, так и вызовите реализованный метод из метода Activity.onSuccess(...).
Простое использование с EventBus.
Зависимость: https://github.com/greenrobot/EventBus
implementation("org.greenrobot:eventbus:3.3.1")
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus-java</artifactId>
<version>3.3.1</version>
</dependency>
Используйте это как: Начать
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
Подпишитесь на Data где угодно:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
Слушайте с:
EventBus.getDefault().register(this);
Вы можете использовать Handler для этого...... вы можете поместить все свои данные в связку и отправить их обработчику, объявить этот обработчик в своем фрагменте и передать этот обработчик в свой асинхронный класс,,,, когда вы получите ответ просто sendMessage к этому обработчику.......
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("Test", "test value");
msg.setData(bundle);
handler.sendMessage(msg);
//Handler in The UI Thread Retreieves The Data
//And Can Update the GUI as Required
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Bundle bundle = msg.getData();
//set data to your views here.........
}
};
Надеюсь, поможет..