AIDL、接口回调、EventBus、广播接收器?

AIDL, Interface Callback, EventBus, Broadcast Receiver?

正在创作音乐 player.There 是一项在后台播放音乐的服务 对于 activity 到服务以及从服务到 activity 我应该使用哪种机制?现在我正在使用绿色机器人 EventBus 和 AIDL。在 EventBus 中哪个更好?我的应用运行良好,但问题是同时多次单击会导致应用出现 ANR。

recyclerViewAdapterTwo = new RecyclerViewAdapterTwo(ActivityTwo.this, trackList, categoriesList, new MusicTracksRecyclerViewAdapterTwo.ViewHolderOnClickHandler() {
        @Override
        public void onClick(int id, MusicTracksRecyclerViewAdapterTwo.VHItem vh) {
            EventBus.getDefault().post(new PostSongListChangeToService(songDataList, position));
        }
    });

如果你的服务和 Activity 在同一个进程中你不应该使用 AIDL,B​​roadCast Receiver 对此没有任何意义 purpose.You 可以使用 IntentService 来实现这个功能.

EventBus、接口回调都是不错的选择。不要为此使用广播接收器。

现在关于 ANR,请您分享一些代码,因为 where/how 您正在处理事件。除此之外,尝试 pre-process 后台线程中的大部分数据,然后跳转到主线程,实际上只是 play/pause/skip 等

PS:如果您正在使用 Handler 在 MainThread 上实际执行操作,请尽量不要一次性 post 一切,在 msg/runnables 到 运行。它可能会在按钮点击时增加轻微的延迟,但不会冻结你的 Activity/Service。

你可以在这里参考奥托:http://square.github.io/otto/

添加另一个选项,因为一段时间以来 Otto 事件总线现在已被弃用,取而代之的是 RxJava。 我建议尝试 RxJava,因为它在线程交换方面提供了更大的灵活性和透明度,并且还提供了巨大的集合或函数式操作,这使得代码更漂亮,因此更易于维护:)

不同之处在于,您无法轻易地 post 从提供的流外部向已订阅的消费者发送事件。

为此,您可以尝试 RHub 启用此 "Bus" 功能。

您可以查看example app