java - 不同类android java中的Paho-mqtt回调

标签 java android callback mqtt paho

我刚刚开始 Java Android 编程,甚至是一般的 Java 编程,我想使用某个 MqttHandler 类实现 Paho MQTT Android 服务,我想将回调设置为 MqttHandler 类的参数。关于回调的其他答案通常建议使用接口(interface)类,但我不知道它是如何工作的。这是我尝试过的:

public interface InterfaceMqttCallback extends MqttCallbackExtended{
    @Override
    public void connectComplete(boolean b, String s);

    @Override
    public void connectionLost(Throwable throwable);

    @Override
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception ;

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken);

}

MqttHandler 类构造函数:

public MqttHandler(Context context, InterfaceMqttCallback mqttCallbackExtended){
    mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId);
    mqttAndroidClient.setCallback(mqttCallbackExtended);
    connect();
}

Activity 中初始化 MqttHandler 的函数:

private void startMqtt(){

    mqttHandler = new MqttHandler(getApplicationContext(), new InterfaceMqttCallback() {
        @Override
        public void connectComplete(boolean b, String s) {
            Log.w("Anjing", s);
        }

        @Override
        public void connectionLost(Throwable throwable) {

        }

        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            Log.w("Anjing", mqttMessage.toString());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }
    });

}

但正如我测试过的那样,我认为回调没有设置,因为没有收到任何消息。因此,我尝试直接在 MqttHandler 中设置回调,它起作用了,收到了消息。

public MqttHandler(Context context, InterfaceMqttCallback mqttCallbackExtended){
    mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId);
    mqttAndroidClient.setCallback(new InterfaceMqttCallback() {
        @Override
        public void connectComplete(boolean b, String s) {
            Log.w("mqtt", s);
        }

        @Override
        public void connectionLost(Throwable throwable) {

        }

        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            Log.w("Anjing", mqttMessage.toString());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }
    });
    connect();
}

那么问题是什么?提前致谢..

编辑:我当然可以将 MqttHandler 类中的 mqttAndroidClient 变量设置为公共(public)变量,但它安全吗?

最佳答案

设置回调处理程序的正确方法是在 MQTT 客户端中设置它,如下所示:

        public class MTTConnector { 
            public void connect {
              MqttAndroidClient mqttClient = new MqttAndroidClient(BaseApplication.getAppContext(), broker, MQTT_CLIENT_ID); 
              mqttClient.setCallback(new MqttCallbackHandler(BaseApplication.getAppContext()));
          }
        }

    public class MqttCallbackHandler implements MqttCallbackExtended {
    @Override
        public void connectComplete(boolean b, String s) {
            Log.w("mqtt", s);
        }

        @Override
        public void connectionLost(Throwable throwable) {

        }

        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            Log.w("Anjing", mqttMessage.toString());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }
  }

如果您使用的是最新版本,您的回调需要实现 MqttCallbackExtended 类,有关在线 GitHub 项目的更多详细信息,请参见以下链接。

MqttCallbackExtended.java

在您的 Activity 中初始化 MTTConnector 并调用连接。

希望对您有所帮助。

干杯!

关于java - 不同类android java中的Paho-mqtt回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799690/

相关文章:

android - 如何在 android 中使用 yelp 分享评论

reactjs - 何时使用 React setState 回调

java - 打印日期时间而不在​​ Sparql 输出中指定数据类型

java - 请澄清有关 Java Servlet 的几点

java - 如何在页面关闭后以编程方式调用 Eclipse F5 刷新

javascript - Android InAppBrowser _system 回调

javascript - Flex 中的 showSettings 回调?

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean. ..期望单个匹配的bean,但发现12

java - 获取 ExpatParser$ParseException?

javascript - 两个串行 webkit 转换在某些 Android 设备上不起作用