如何在 运行 代码能够访问触发器中提供的变量的情况下使 运行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);
}
}
)
);
我有一个 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);
}
}
)
);