如何在 运行 代码能够访问触发器中提供的变量的情况下使 运行nable

How to make a runnable where the run code is able to access a variable provided in the trigger

我有一个 class 侦听 websocket,当收到消息时,它应该根据消息类型执行一些代码。 在我的整个应用程序中,我希望能够注册更多的听众。

我创建了以下 MessageListener class:

static class MessageListener {
    private String triggerMessage;
    private Runnable runnable;

    MessageListener(String message, Runnable runnable) {
        this.triggerMessage = message;
        this.runnable = runnable;
    }

    private void trigger(String message) {
        if (message.equals(triggerMessage)) {
            runnable.run();
        }
    }
}

我这样添加监听器:

ws.setListener(new IPDWebSocket.MessageListener("disconnect", new Runnable() {
        @Override
        public void run() {
          Log.e("xx", "Received message: ");
        }
    }
  )
);

收到消息后,它会像这样触发侦听器:

for (int nr=0; nr < listeners.size(); nr++) {
    listeners.get(nr).trigger(msg);
}

现在我的问题是在 Runnable 中我希望能够使用消息变量。像这样:

ws.setListener(new IPDWebSocket.MessageListener("disconnect", new Runnable() {
        @Override
        public void run() {
          Log.e("xx", "Received message: " + message);
        }
    }
  )
);

但显然变量 "message" 没有在任何地方定义。 关于如何实现这个的任何想法?多谢!

您可以直接在 run 方法实现中设置消息。

ws.setListener(createListener("disconnect"));
ws.setListener(createListener("connect"));

private IPDWebSocket.MessageListener createListener(final String message) {
  return new IPDWebSocket.MessageListener(message, new Runnable() {
        @Override
        public void run() {
          Log.e("xx", "Received message: " + message);
        }
    }
  )
}

您可以使用自己的 interface 来实现此方案,而不是使用 Runnable,

Ex 在你的 MessageListener

中创建一个接口
static class MessageListener {
    private String triggerMessage;
    private MessageTriggerListener runnable;

    public interface MessageTriggerListener {
        public void onMessageReceived(String message);
    }

    MessageListener(String message, MessageTriggerListener runnable) {
        this.triggerMessage = message;
        this.runnable = runnable;
    }

    private void trigger(String message) {
        if (message.equals(triggerMessage)) {
            runnable.onMessageReceived(message);
        }
    }
}

你可以像这样实现监听器,

ws.setListener(new IPDWebSocket.MessageListener("disconnect", new MessageListener.MessageTriggerListener() {
            @Override
            public void onMessageReceived(String message) {
                Log.e("xx", "Received message: " + message);
            }
        }
        )
);