android - 事件总线 fragment 注销

标签 android android-fragments event-bus greenrobot-eventbus

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

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

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

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

最佳答案

可以将事件总线事件移动到onStart()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();
     }
}

关于android - 事件总线 fragment 注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499875/

相关文章:

ruby-on-rails-4 - 在模型回调上触发 Rails Controller 中的操作

android - 事件总线库机制是否与使用静态变量在 Activity 之间传递数据一样糟糕?

javascript - VueJS 组件发出重复事件

android - IllegalArgumentException Base64 到图像解码android

android - React Native : What's the difference between gradle references in gradle-wrapper. 属性和 build.gradle?

Android-Market,一个类似 Facebook 的 API 来导出评论?

java - 如何使用 AsyncTask 实时检索 RAM 消耗情况

android - 将 map (谷歌地图 v2)放入 fragment 中的最佳方式

java - Android:在使用短信 Intent 后返回 Activity

android - AlertDialog 没有关闭