我有两个活动A和B。
在活动A中,我有一个AsyncHttpClient从网站获取一些数据。收到数据后,我会刷新活动A中的RecyclerView。但是,当数据被提取时,如果有人切换到活动B,我希望在数据提取完成时刷新活动B的RecycerView。
目前我可以在相同的活动A中更新,但在B中无法做到这一点。
以下是我所做的-
public void loadFromWeb(){
RequestParams params = new RequestParams();
AsyncHttpClient client = new AsyncHttpClient();
params.put("id", id);
client.post("http://example.com/process.php", params, new JsonHttpResponseHandler() {
@Override
public void onStart() {
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
//process the response
adapterInActivityA.notifyDataSetChanged();
//This works for Activity A
//How to implement the function updateInActivityB()?
updateInActivityB();
} catch (Exception e) {
//catch exception
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
// Process failure
}
});
}
问题是如何实现函数updateInActivityB()
溶液(如Alok建议)
以下是我为其他想做同样事情的人所做的细节-
这使用了greenrobot的EventBus库
通过将库添加到应用程序的build.gradle文件来编译库
编译库
compile 'de.greenrobot:eventbus:2.4.0'
创建您的事件类,这将存储您正在通信的数据。
//In FirstActivity
public class myEvent {
private final String data;
//Constructor
public myEvent(String data){
this.data = data;
}
public String getData(){
return data;
}
}
每当您想发送更新时,数据都已下载(即在updateInSecondActivity()函数中)
发布更新-
//In FirstActivity
public void updateInSecondActivity(){
EventBus.getDefault().post(new myEvent("Updated Data");
}
现在,在SecondActivity中,您必须收听此事件。在SecondActivity中首次注册以订阅事件-
注册事件
//In SecondActivity
EventBus.getDefault().register(this);
您可以在onCreate()、onStart()和onResume()中注册。另外,不要忘记在onPause()、onDestroy()和onStop()-中注销
注销事件侦听器
//In SecondActivity
EventBus.getDefault().unregister(this);
一旦注册和注销到位,您必须了解FirstActivity是否发布了更新。您可以通过创建一个onEvent()函数来实现这一点,该函数监听myEvent类-的发布
收听事件
//In SecondActivity
public void onEvent(myEvent mE){
String updatedData = me.getData();
// Process/update using the updateData
}
- 您可以尝试制作一个可以接收广播的广播接收器异步线程触发的消息
或
2.您可以使用事件总线进行无限的通信。
或
3.你可以为收到的内容注册一名观察员。
逻辑很简单如果在用户切换到下一个活动之前提取的数据一切正常,则尝试提取数据。
在第二种情况下,当用户提前切换时,您可以在恢复下一个活动时检查内容。如果内容还没有收到,那么您可以实现上述3种方法中的任何一种,最终当内容收到时,您的观测者将收到通知。