事件总线片段注销
Event Bus Fragment Unregister
我有一个注册到事件总线的闪屏片段:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
如果屏幕进入自动锁定状态(或任何其他可以调用 onStop 的事件),容器 activity 进入 onStop 并且片段不再能够接收(网络)事件。我正在考虑 moving "unregister" 逻辑 到 onDestroy 方法。这是个好主意吗?
你可以将事件总线事件移动到onStart()
和onStop()
,但你应该知道某些方法不能在[=14=之后调用](例如,关闭 DialogFragment 会使您崩溃)。
所以虽然这个例子是针对 Otto 的,但我将它切换到了 EventBus,并且我个人有一个包装器可以在应用程序暂停时存储事件。
public enum SingletonBus {
INSTANCE;
private static String TAG = SingletonBus.class.getSimpleName();
private final Vector<Object> eventQueueBuffer = new Vector<>();
private boolean paused;
public <T> void post(final T event) {
if (paused) {
eventQueueBuffer.add(event);
} else {
EventBus.getDefault().post(event);
}
}
public <T> void register(T subscriber) {
EventBus.getDefault().register(subscriber);
}
public <T> void unregister(T subscriber) {
EventBus.getDefault().unregister(subscriber);
}
public boolean isPaused() {
return paused;
}
public void setPaused(boolean paused) {
this.paused = paused;
if (!paused) {
Iterator<Object> eventIterator = eventQueueBuffer.iterator();
while (eventIterator.hasNext()) {
Object event = eventIterator.next();
post(event);
eventIterator.remove();
}
}
}
}
然后在各种 BaseActivity 中,
public class BaseActivity extends AppCompatActivity {
@Override
public void onPostResume() {
super.onPostResume();
SingletonBus.INSTANCE.setPaused(false);
}
@Override
public void onPause() {
SingletonBus.INSTANCE.setPaused(true);
super.onPause();
}
}
我最近遇到了类似的问题。
一开始我用的是Otto,后来改用greenrobot的EventBus。
使用 EventBus,您可以注册您的对象 sticky。 EventBus.getDefault().registerSticky(this)
也就是说,这个对象在注册后会自动接收它正在等待的每一个粘性事件。然后必须将这些事件张贴在粘性上。 (EventBus.getDefault().postSticky(event)
)
如果您不再需要粘性事件,请考虑将其删除
(EventBus.getDefault().removeSticky(Event.class)
)。
因此,如果您只想接收此事件一次,则应将其删除。
也许这种方法可以满足您的需求。
我有一个注册到事件总线的闪屏片段:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
如果屏幕进入自动锁定状态(或任何其他可以调用 onStop 的事件),容器 activity 进入 onStop 并且片段不再能够接收(网络)事件。我正在考虑 moving "unregister" 逻辑 到 onDestroy 方法。这是个好主意吗?
你可以将事件总线事件移动到onStart()
和onStop()
,但你应该知道某些方法不能在[=14=之后调用](例如,关闭 DialogFragment 会使您崩溃)。
所以虽然这个例子是针对 Otto 的,但我将它切换到了 EventBus,并且我个人有一个包装器可以在应用程序暂停时存储事件。
public enum SingletonBus {
INSTANCE;
private static String TAG = SingletonBus.class.getSimpleName();
private final Vector<Object> eventQueueBuffer = new Vector<>();
private boolean paused;
public <T> void post(final T event) {
if (paused) {
eventQueueBuffer.add(event);
} else {
EventBus.getDefault().post(event);
}
}
public <T> void register(T subscriber) {
EventBus.getDefault().register(subscriber);
}
public <T> void unregister(T subscriber) {
EventBus.getDefault().unregister(subscriber);
}
public boolean isPaused() {
return paused;
}
public void setPaused(boolean paused) {
this.paused = paused;
if (!paused) {
Iterator<Object> eventIterator = eventQueueBuffer.iterator();
while (eventIterator.hasNext()) {
Object event = eventIterator.next();
post(event);
eventIterator.remove();
}
}
}
}
然后在各种 BaseActivity 中,
public class BaseActivity extends AppCompatActivity {
@Override
public void onPostResume() {
super.onPostResume();
SingletonBus.INSTANCE.setPaused(false);
}
@Override
public void onPause() {
SingletonBus.INSTANCE.setPaused(true);
super.onPause();
}
}
我最近遇到了类似的问题。
一开始我用的是Otto,后来改用greenrobot的EventBus。
使用 EventBus,您可以注册您的对象 sticky。 EventBus.getDefault().registerSticky(this)
也就是说,这个对象在注册后会自动接收它正在等待的每一个粘性事件。然后必须将这些事件张贴在粘性上。 (EventBus.getDefault().postSticky(event)
)
如果您不再需要粘性事件,请考虑将其删除
(EventBus.getDefault().removeSticky(Event.class)
)。
因此,如果您只想接收此事件一次,则应将其删除。
也许这种方法可以满足您的需求。