我有一个比较笼统的问题。 假设我有一个 MainActivity 形式的 RecyclerView 。此RecyclerView的内容正在其他活动中的多个位置更新。
例如,可以通过启动一个新的Activity并将其保存在那里来进行新输入。在这种情况下,我会直观地从startActivityForResult()
开始该Activity并在onActivityResult()
中接收更改。 MainActivity中的方法。
但是,可以说在应用程序内部更深,有可能删除所有条目。现在,我们如何通知MainActivity有关数据集中的更改?我考虑过设置某种标志,并在MainActivity中更新内容后将其清除。但是以某种方式使用全局变量并不能真正遵循正确封装的原理,对吗?
很抱歉这个模糊的问题,但是我发现很难以一种优雅的方式正确处理Android中的信息流,所以就在这里。
答案 0 :(得分:0)
您可以使用Handler在活动中传递消息,然后必须更新 RecyclerView 。喜欢,
1)在活动中。
public static Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.what == 1223){
//update RecyclerView
}
return false;
}
});
2)通过消息,当您想更新RecyclerView时
Message msg = new Message();
msg.what = 1223;
Activity1.mHandler.sendMessage(msg);
答案 1 :(得分:0)
您可以使用EventBus
来处理它。
为您的活动定义一个班级
public static class MyEvent {
int event;
/* define your fields */
}
并准备主要活动中的订户
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMyEvent(MyEvent myEvent) {
switch(myEvent.event) {
/* Do what you need */
}
};
现在您需要进行更改的地方,像这样致电您的订户:
MyEvent myEvent = new MyEvent();
myEvent.event = 1;
EventBus.getDefault().post(myEvent);
您可以在here
中了解有关EventBus的更多信息答案 2 :(得分:0)
如果您使用的是RxJava2
,则RxAndroid
。然后您可以尝试一下。
创建公交车:
public final class RxBus {
private static final BehaviorSubject<Object> behaviorSubject = BehaviorSubject.create();
public static BehaviorSubject<Object> getSubject() {
return behaviorSubject;
}
}
在WaitingActivity中要接收数据的位置(在这种情况下不要使用onActivityResult
的地方)
Disposable disposable = RxBus.getSubject().
subscribeWith(new DisposableObserver<Object>() {
@Override
public void onNext(Object o) {
if (o instanceof DataObject) {
//((DataObject) o).getValue();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
});
在您要发送数据的活动中
RxBus.getSubject().onNext(dataObject);
startActivity(new Intent(CurrentActivity.class, WaitingActivity.class));
最后不要忘了处置一次性用品,以免WaitingActivity中的内存泄漏
@Override
protected void onDestroy() {
super.onDestroy();
disposable.dispose();
}
答案 3 :(得分:0)
local broadcast怎么样?您可以在此document中找到广播的想法。您需要本地广播,如果只想在您的应用程序中传递数据,则是首选方法。
Android应用程序可以从Android系统和其他Android应用程序发送或接收广播消息,类似于发布-订阅设计模式。当感兴趣的事件发生时,将发送这些广播。例如,Android系统会在发生各种系统事件(例如系统启动或设备开始充电)时发送广播。应用程序还可以发送自定义广播,例如,以向其他应用程序通知他们可能感兴趣的内容(例如,已下载一些新数据)。
答案 4 :(得分:0)
在模型中,您的数据应与视图分开。如果其他活动发生变化,理想情况下必须从那里更新回收者视图。因此,无论哪个活动做什么,在加载时刷新数据或恢复回收视图的数据时,始终会得到正确的结果。