我正在解析JSON
与活动中的Async Http
。一旦数据成功解析,我希望它可用于活动持有的两个片段。一个片段是显示下载数据的ListView
,另一个片段是显示数据的Google MapView
- 这并不重要。
下载数据后:
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
// Data downloaded
}
我想将其发送给这两个fragments
,并用数据更新地图和ListView
。
因此,我想以某种方式在这两个片段中实现某种侦听器,该侦听器将侦听"onSuccess"
发生,然后使用它检索到的数据。
因此,如果onSuccess
发生在Fragments
实例化之前,它们将立即显示数据。如果没有,他们会等待它。
有人可以帮助我实现这一点吗?我不知道该如何解决这个问题。
您有以下选项:
- 使用事件总线并将数据发送到两个片段
- 将数据存储在活动中,使用LocalBroadcasrManager并发送广播,让片段知道数据已经从片段下载和访问数据,即
((MyActivity)getActivity()).getData();
消息的本地广播适合这种情况。
以下几点也会对您有所帮助。
- 获取数据后实例化片段并通过setArgument(Bundle)方法传递(如果响应获取是一次性的)
- 如果 onSucces() 中的数据定期出现,则实现您自己的方法来更新两个片段的 UI,并从 Activity.onSuccess(...) 方法调用实现的方法。
你可以使用 Handler 来实现这一点......您可以将所有数据放在捆绑包中并将其发送到处理程序,并在片段中声明此处理程序,并将此处理程序传递给异步类,,,,当您获得响应时,只需将消息发送到该处理程序......
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.........
}
};
希望对您有所帮助。
处理器
易于与 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;
}
}
随时随地订阅数据:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
聆听:
EventBus.getDefault().register(this);