首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行代码能够访问触发器中提供的变量的情况下使

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

Stack Overflow用户
提问于 2017-08-22 22:52:49
回答 2查看 83关注 0票数 2

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

我创建了以下MessageListener类:

代码语言:javascript
复制
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();
        }
    }
}

我像这样添加了一个监听器:

代码语言:javascript
复制
ws.setListener(new IPDWebSocket.MessageListener("disconnect", new Runnable() {
        @Override
        public void run() {
          Log.e("xx", "Received message: ");
        }
    }
  )
);

当收到一条消息时,它将触发监听器,如下所示:

代码语言:javascript
复制
for (int nr=0; nr < listeners.size(); nr++) {
    listeners.get(nr).trigger(msg);
}

现在我的问题是,在Runnable中,我希望能够使用message变量。如下所示:

代码语言:javascript
复制
ws.setListener(new IPDWebSocket.MessageListener("disconnect", new Runnable() {
        @Override
        public void run() {
          Log.e("xx", "Received message: " + message);
        }
    }
  )
);

但是很明显,变量"message“并没有在任何地方定义。关于如何实现这一点有什么想法吗?非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-22 23:16:19

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

例如,在MessageListener中创建一个接口

代码语言:javascript
复制
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);
        }
    }
}

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

代码语言:javascript
复制
ws.setListener(new IPDWebSocket.MessageListener("disconnect", new MessageListener.MessageTriggerListener() {
            @Override
            public void onMessageReceived(String message) {
                Log.e("xx", "Received message: " + message);
            }
        }
        )
);
票数 0
EN

Stack Overflow用户

发布于 2017-08-22 23:05:12

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

代码语言:javascript
复制
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);
        }
    }
  )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45820935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档