1

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

这就是我所拥有的(我按照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

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

4

3 回答 3

3

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

您无需注册即可发布,但您确实需要它来进行@Produce注释。

于 2014-12-23T18:46:17.453 回答
1

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

于 2014-12-23T18:35:39.810 回答
0

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

于 2015-02-05T14:07:07.850 回答