6

对于 Java 生态系统相对较新的人来说,是否有一种相当轻量级的方式来执行 Qt 和 Django 等框架对其信号/接收器系统所做的事情,其中​​组件可以说“我在做某事”,而其他组件可以处理以相当松散耦合的方式?

如果这个问题未能通过“单一客观答案”测试,我提前道歉。

编辑:要添加更多上下文,这与 Web 服务的数据库驱动应用程序层有关。某些资源在持久化时还需要保存包含额外上下文信息的审计记录。在 Django 中,我会通过信号机制来做到这一点,或者使用几个现有的库之一来做到这一点。对于 Scala 程序,我使用回调函数制作了自己的 hacky 东西,但使用一流的函数更容易。我毫不怀疑 Swing 之类的框架为这种事情提供了便利,但我(也许是不合理的)很想将这种依赖添加到目前相当普通的应用程序中(并不是说 Django 本身不是一个对香草 Python 的大量依赖!)

4

4 回答 4

4

在 Java 中,至少在 UI 方面,这通常是通过侦听器方法完成的:您注册一个侦听器方法,该方法在特定事件发生时被调用。不过,它可能比 Qt 信号/槽机制松散耦合少一些……您可能会考虑的另一种方法是 java消息服务,它专为基于 Java EE 标准的客户端/服务器系统中的松散耦合通信而设计.

于 2012-09-21T20:04:48.583 回答
4

如果您正在寻找提供类似于 Qt 的信号/插槽机制的 Java 库,那么您应该看看sig4j。它是线程安全的、类型安全的并支持不同类型的连接。

注意:我是这个库的作者 :)

于 2015-11-12T07:23:40.263 回答
2

我同意关于事件驱动编程的其他评论/答案。

您可能对http://eventbus.org感兴趣。这允许您在全球范围内广播/接收事件,而无需在每个事件生产者上显式注册侦听器。

于 2012-09-21T21:26:45.003 回答
1

在要接收信号的类中,可以定义一个 Broadcastreceiver:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateUI();
    }
};

@Override
public void onPause() {
    super.onPause();
    getActivity().unregisterReceiver(broadcastReceiver);
}

@Override
public void onResume() {
    super.onResume();
    getActivity().registerReceiver(broadcastReceiver, new IntentFilter(Constants.ACTION_UPDATE_PROFILE_UI)); // the constant is to identify the type of signal, it can be any string you want
}

然后在要发送信号的类中,只需执行以下操作:

Intent signalIntent = new Intent(Constants.ACTION_UPDATE_PROFILE_UI);

将您想要的数据类型添加到意图,然后像这样广播它:

sendBroadcast(signalIntent);

您可以在此处找到示例应用程序:

https://github.com/nickfox/Update-Android-UI-from-a-Service

于 2015-08-21T16:09:31.430 回答