6

我有一个注册到事件总线的闪屏片段:

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

如果屏幕自动锁定(或任何其他可以调用 onStop 的事件),容器活动将继续 onStop,并且片段不再能够接收(网络)事件。我正在考虑“注销”逻辑移至 onDestroy方法。这是个好主意吗?

4

2 回答 2

11

可以将事件总线事件移至onStart()and onStop(),但您应该知道某些方法不能在之后调用onSaveInstanceState()(例如,关闭 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();
     }
}
于 2015-07-19T09:56:22.800 回答
2

我最近有一个类似的问题。首先我使用 Otto,然后切换到 greenrobot 的 EventBus。使用 EventBus,您可以注册您的对象stickyEventBus.getDefault().registerSticky(this) 也就是说,这个对象在注册后会自动接收它正在等待的每一个粘性事件。然后必须将这些事件发布为粘性。( EventBus.getDefault().postSticky(event))

如果您不再需要粘性事件,请考虑删除它们 ( EventBus.getDefault().removeSticky(Event.class))。因此,如果您只想接收一次此事件,则应将其删除。也许这种方法可能适合您的需求。

于 2015-07-19T14:23:00.327 回答