我有一个监听websocket的类,当收到消息时,它应该根据消息类型执行一些代码。在我的整个应用程序中,我希望能够注册更多的监听器。
我创建了以下MessageListener类:
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中,我希望能够使用message变量。如下所示:
ws.setListener(new IPDWebSocket.MessageListener("disconnect", new Runnable() {
@Override
public void run() {
Log.e("xx", "Received message: " + message);
}
}
)
);但是很明显,变量"message“并没有在任何地方定义。关于如何实现这一点有什么想法吗?非常感谢!
发布于 2017-08-22 23:16:19
您可以使用自己的interface来实现此场景,而不是使用Runnable,
例如,在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);
}
}
)
);发布于 2017-08-22 23:05:12
您可以直接在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);
}
}
)
}https://stackoverflow.com/questions/45820935
复制相似问题