【问题标题】:Otto events received twiceOtto 事件收到两次
【发布时间】:2014-12-23 18:25:30
【问题描述】:

我尝试使用Otto。我认为它到目前为止有效,但我收到了两次事件。

这就是我所拥有的(我关注了example on GitHub):

制作人:

public class NetworkChangeReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(final Context context, final Intent intent)
    {
        Log.i("ralphs", "onReceive");

        // .... more stuff

        final Bus bus = TRaumfeldApp.getInstance().getBus();
        bus.register(this);
        bus.post(new NetworkChangeEvent());
        bus.unregister(this);
    }

    @Produce
    public NetworkChangeEvent produceAnswer()
    {
        Log.i("ralphs", "produceAnswer");
        return new NetworkChangeEvent();
    }
}

订阅者:

public class MainActivity extends ActionBarActivity
{
    private Bus              mBus;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // otto event bus
        mBus = TRaumfeldApp.getInstance().getBus();
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        mBus.register(this);
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        mBus.unregister(this);
    }

    @Subscribe
    public void answerAvailable(NetworkChangeEvent event)
    {
        Log.i("ralphs", "answerAvailable");
    }
}

日志锁是这样的:

I/ralphs﹕ onReceive
I/ralphs﹕ produceAnswer
I/ralphs﹕ answerAvailable
I/ralphs﹕ answerAvailable

为什么我会收到两次事件?

【问题讨论】:

    标签: android otto


    【解决方案1】:

    当您的订阅者注册时,如果注册了具有此类方法的对象,它将从@Produce-annotated 方法中获取第一个事件。第二个事件来自显式的post() 操作。

    您无需注册即可发帖,但@Produce 注释确实需要注册。

    【讨论】:

      【解决方案2】:

      当您想发布活动时,您无需注册。

      【讨论】:

        【解决方案3】:

        据我所知,此问题与正常工作的 Otto Events Bus 无关。此错误与 Android API 和网络更改事件中的广播接收器有关。这也是设备特定的问题。某些设备可能会收到 2 或 3 个网络更改事件。您可以通过创建一个名为例如的类来处理该问题。 NetworkState 带有一个静态变量,指示网络连接的当前状态,并且仅在连接状态发生更改时才将事件发布到总线。 此问题已在 NetworkEvents 库中处理。你可以浏览它的源代码,看看它是如何处理的,或者在你的项目中使用这个库。特别是你可以看看NetworkConnectionChangeReceiver类。这不是最好的解决方案,但在广播接收器无法按预期工作之前,我们无能为力。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-03
          • 1970-01-01
          相关资源
          最近更新 更多