【发布时间】:2016-05-24 14:43:40
【问题描述】:
我有两个活动 A 和 B。
在活动 A 中,我有一个 AsyncHttpClient 从网站获取一些数据。收到数据后,我会在活动 A 中刷新 RecyclerView。但是,如果有人切换到活动 B,则在获取数据时,我希望在完成数据获取时刷新活动 B 的 RecyclerView。
目前我可以在同一个活动 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's EventBus library
通过将库添加到应用的 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
}
【问题讨论】:
-
你可以用监听器写一些单音(不好的模式)或者写自定义服务
-
如果您想在它们之间共享数据恕我直言,您需要将数据/网络逻辑从任何活动中移开。我会使用 MVP 方法,或者如果您不希望这样做,您可以使用 SQLite 数据库并与 CursorAdapters/ContentObservers 一起创建内容提供程序。当然还有其他方法,但这是我的处理方式。
-
谢谢,我使用事件总线来管理交互活动通信
标签: java android android-activity android-recyclerview android-async-http