奥托事件收到了两次

时间:2014-12-23 18:25:31

标签: android otto

我尝试使用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

为什么我两次收到活动?

3 个答案:

答案 0 :(得分:3)

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

您无需注册即可发布,但您需要@Produce注释。

答案 1 :(得分:1)

如果您想发布活动,则无需注册。

答案 2 :(得分:0)

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