Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多次调用onCreate时,MQTT会创建多个连接_Java_Android_Mqtt_Paho - Fatal编程技术网

Java 多次调用onCreate时,MQTT会创建多个连接

Java 多次调用onCreate时,MQTT会创建多个连接,java,android,mqtt,paho,Java,Android,Mqtt,Paho,我正在使用Paho Android MQTT客户端创建一个即时消息系统。它的实现工作如预期,但是我面临这些错误 我在MainActivity类的onCreate中调用连接类(这也需要创建到代理的连接) 现在的问题是,假设我在MainActivity类上,按back键从MainActivity类移动到另一个活动,然后再返回MainActivity类,将创建另一个代理连接。这意味着只要发布一条消息,客户端就会收到两次消息 MainActivity.java: public class MainAct

我正在使用Paho Android MQTT客户端创建一个即时消息系统。它的实现工作如预期,但是我面临这些错误

我在
MainActivity类
onCreate
中调用
连接类
(这也需要创建到代理的连接)

现在的问题是,假设我在
MainActivity类
上,按back键从
MainActivity类
移动到另一个活动,然后再返回
MainActivity类
,将创建另一个代理连接。这意味着只要发布一条消息,客户端就会收到两次消息

MainActivity.java:

public class MainActivity extends Activity {

    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.chat_intera);

        Connection connection = Connection.getInstance (getApplicationContext ());
    }

    // ....
}
公共类MainActivity扩展了AppCompatActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat_intera);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    dbHelper = DatabaseManager.getInstance(context);
    //mRecyclerView = (RecyclerView) findViewById(R.id.history_recycler_view);

    connections = new Connections();
    connections.createConnectionForPublishing(context);

}


@Override
public void onDestroy() {
    super.onDestroy();
    System.out.println("LOG: Service destroyed");
}
}

Connection.java

public class Connection {

    public void createConnectionForPublishing (final Context context) {

        //Instantiate the mqtt android client class
        mqttAndroidClient = new MqttAndroidClient (context.getApplicationContext (), serverUri, clientId);


        mqttAndroidClient.setCallback (new MqttCallbackExtended () {

            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                if (reconnect) {
                    System.out.println ("Reconnected to : " + serverURI);
                } else {
                    System.out.println ("Connected to: " + serverURI);
                }
            }

            @Override
            public void connectionLost (Throwable cause) {
                System.out.println ("The Connection was lost.");
            }

            @Override
            public void messageArrived (String topic, final MqttMessage message) throws Exception {
                System.out.println ("Message received and Arrived");
            }

            @Override
            public void deliveryComplete (IMqttDeliveryToken token) {
                System.out.println("Message Delivered");
            }
        });

        final MqttConnectOptions mqttConnectOptions = new MqttConnectOptions (); 
        mqttConnectOptions.setMqttVersion (MqttConnectOptions.MQTT_VERSION_3_1_1);
        mqttConnectOptions.setAutomaticReconnect (true);
        mqttConnectOptions.setCleanSession (false);

        try {
            mqttAndroidClient.connect (mqttConnectOptions, null, new IMqttActionListener () {

                @Override
                public void onSuccess (IMqttToken asyncActionToken) {
                    System.out.println ("BROKER CONNECTED");

                    DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions ();
                    disconnectedBufferOptions.setBufferEnabled (true);
                    disconnectedBufferOptions.setBufferSize (100);
                    disconnectedBufferOptions.setPersistBuffer (false);
                    disconnectedBufferOptions.setDeleteOldestMessages (false);

                    //mqttAndroidClient.setBufferOpts (disconnectedBufferOptions);

                }

                @Override
                public void onFailure (IMqttToken asyncActionToken, Throwable exception) {
                    System.out.println ("Failed to connect to: " + serverUri);
                }
            });

        } catch (MqttException ex) {
            ex.printStackTrace ();
        }
    }

    // ...
}
public class Connection {

    private       static Connection          connInst;
    private       static boolean             connected;

    private       static MqttAndroidClient   mqttAndroidClient;
    private       static IMqttActionListener mqttActionListener;
    private final static MqttConnectOptions  mqttConnectOptions = new MqttConnectOptions (); 
    static {
        mqttConnectOptions.setMqttVersion (MqttConnectOptions.MQTT_VERSION_3_1_1);
        mqttConnectOptions.setAutomaticReconnect (true);
        mqttConnectOptions.setCleanSession (false);
    }

    private Connection (Context context) {
        //Instantiate the mqtt android client class
        mqttAndroidClient = new MqttAndroidClient (context.getApplicationContext (), serverUri, clientId);

        mqttAndroidClient.setCallback (new MqttCallbackExtended () {

            @Override
            public void connectComplete (boolean reconnect, String serverURI) {
                connected = true;
                if (reconnect) {
                    System.out.println ("Reconnected to : " + serverURI);
                } else {
                    System.out.println ("Connected to: " + serverURI);
                }
            }

            @Override
            public void connectionLost (Throwable cause) {
                connected = false;
                System.out.println ("The Connection was lost.");
            }

            @Override
            public void messageArrived (String topic, final MqttMessage message) throws Exception {
                System.out.println ("Message received and Arrived");
            }

            @Override
            public void deliveryComplete (IMqttDeliveryToken token) {
                System.out.println("Message Delivered");
            }
        });

        mqttActionListener = new IMqttActionListener () {

            @Override
            public void onSuccess (IMqttToken asyncActionToken) {
                System.out.println ("BROKER CONNECTED");

                DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions ();
                disconnectedBufferOptions.setBufferEnabled (true);
                disconnectedBufferOptions.setBufferSize (100);
                disconnectedBufferOptions.setPersistBuffer (false);
                disconnectedBufferOptions.setDeleteOldestMessages (false);

                //mqttAndroidClient.setBufferOpts (disconnectedBufferOptions);

            }

            @Override
            public void onFailure (IMqttToken asyncActionToken, Throwable exception) {
                System.out.println ("Failed to connect to: " + serverUri);
            }
        });
    }

    public static Connection getInstance (Context context) {
        if (connInst == null) {
            connInst = new Connection (context);
        }
        createConnectionIfNeeded (context);

        return connInst;
    }

    private static void createConnectionIfNeeded () {
        if (connected) {
            return;
        }

        try {
            mqttAndroidClient.connect (mqttConnectOptions, null, mqttActionListener);

        } catch (MqttException ex) {
            ex.printStackTrace ();
        }
    }

    // ...
}

我是MQTT的新手,如果有人能帮助我,我会很高兴。提前谢谢

我不确定,但我想空检查可能会有所帮助

if (connection == null){
   connections = new Connections();
   connections.createConnectionForPublishing(context);
}

然后,如果您不想多次建立连接,则必须将其设置为singleton,以便只建立一个connection类实例和一次连接

因此,您的代码将成为:

MainActivity.java:

public class MainActivity extends Activity {

    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.chat_intera);

        Connection connection = Connection.getInstance (getApplicationContext ());
    }

    // ....
}
Connection.java

public class Connection {

    public void createConnectionForPublishing (final Context context) {

        //Instantiate the mqtt android client class
        mqttAndroidClient = new MqttAndroidClient (context.getApplicationContext (), serverUri, clientId);


        mqttAndroidClient.setCallback (new MqttCallbackExtended () {

            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                if (reconnect) {
                    System.out.println ("Reconnected to : " + serverURI);
                } else {
                    System.out.println ("Connected to: " + serverURI);
                }
            }

            @Override
            public void connectionLost (Throwable cause) {
                System.out.println ("The Connection was lost.");
            }

            @Override
            public void messageArrived (String topic, final MqttMessage message) throws Exception {
                System.out.println ("Message received and Arrived");
            }

            @Override
            public void deliveryComplete (IMqttDeliveryToken token) {
                System.out.println("Message Delivered");
            }
        });

        final MqttConnectOptions mqttConnectOptions = new MqttConnectOptions (); 
        mqttConnectOptions.setMqttVersion (MqttConnectOptions.MQTT_VERSION_3_1_1);
        mqttConnectOptions.setAutomaticReconnect (true);
        mqttConnectOptions.setCleanSession (false);

        try {
            mqttAndroidClient.connect (mqttConnectOptions, null, new IMqttActionListener () {

                @Override
                public void onSuccess (IMqttToken asyncActionToken) {
                    System.out.println ("BROKER CONNECTED");

                    DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions ();
                    disconnectedBufferOptions.setBufferEnabled (true);
                    disconnectedBufferOptions.setBufferSize (100);
                    disconnectedBufferOptions.setPersistBuffer (false);
                    disconnectedBufferOptions.setDeleteOldestMessages (false);

                    //mqttAndroidClient.setBufferOpts (disconnectedBufferOptions);

                }

                @Override
                public void onFailure (IMqttToken asyncActionToken, Throwable exception) {
                    System.out.println ("Failed to connect to: " + serverUri);
                }
            });

        } catch (MqttException ex) {
            ex.printStackTrace ();
        }
    }

    // ...
}
public class Connection {

    private       static Connection          connInst;
    private       static boolean             connected;

    private       static MqttAndroidClient   mqttAndroidClient;
    private       static IMqttActionListener mqttActionListener;
    private final static MqttConnectOptions  mqttConnectOptions = new MqttConnectOptions (); 
    static {
        mqttConnectOptions.setMqttVersion (MqttConnectOptions.MQTT_VERSION_3_1_1);
        mqttConnectOptions.setAutomaticReconnect (true);
        mqttConnectOptions.setCleanSession (false);
    }

    private Connection (Context context) {
        //Instantiate the mqtt android client class
        mqttAndroidClient = new MqttAndroidClient (context.getApplicationContext (), serverUri, clientId);

        mqttAndroidClient.setCallback (new MqttCallbackExtended () {

            @Override
            public void connectComplete (boolean reconnect, String serverURI) {
                connected = true;
                if (reconnect) {
                    System.out.println ("Reconnected to : " + serverURI);
                } else {
                    System.out.println ("Connected to: " + serverURI);
                }
            }

            @Override
            public void connectionLost (Throwable cause) {
                connected = false;
                System.out.println ("The Connection was lost.");
            }

            @Override
            public void messageArrived (String topic, final MqttMessage message) throws Exception {
                System.out.println ("Message received and Arrived");
            }

            @Override
            public void deliveryComplete (IMqttDeliveryToken token) {
                System.out.println("Message Delivered");
            }
        });

        mqttActionListener = new IMqttActionListener () {

            @Override
            public void onSuccess (IMqttToken asyncActionToken) {
                System.out.println ("BROKER CONNECTED");

                DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions ();
                disconnectedBufferOptions.setBufferEnabled (true);
                disconnectedBufferOptions.setBufferSize (100);
                disconnectedBufferOptions.setPersistBuffer (false);
                disconnectedBufferOptions.setDeleteOldestMessages (false);

                //mqttAndroidClient.setBufferOpts (disconnectedBufferOptions);

            }

            @Override
            public void onFailure (IMqttToken asyncActionToken, Throwable exception) {
                System.out.println ("Failed to connect to: " + serverUri);
            }
        });
    }

    public static Connection getInstance (Context context) {
        if (connInst == null) {
            connInst = new Connection (context);
        }
        createConnectionIfNeeded (context);

        return connInst;
    }

    private static void createConnectionIfNeeded () {
        if (connected) {
            return;
        }

        try {
            mqttAndroidClient.connect (mqttConnectOptions, null, mqttActionListener);

        } catch (MqttException ex) {
            ex.printStackTrace ();
        }
    }

    // ...
}

我建议您使用Android
onPause()

然后使用
onCreate()
,而不是使用
onResume()
来启动MQTT连接,但首先检查
onPause()
标志


您可能还需要在
onPause()
onDestroy()
中关闭连接。查看Android应用程序/活动的生命周期以了解更多信息。

您是否仅在该活动中需要MQTT客户端?如果没有,也许您应该在活动的onPause void上关闭连接。正如我在这里看到的,MqttAndroidClient对象存在一个封闭的空白created@George,您如何知道它们已创建?或者分享你的全部代码。(关于简历等…)检查我上面的更新,我已经更新了
MainActivity类
,这就是我使用itOk的方式。1-用我的代码替换你的代码。2-您如何知道正在创建多个连接?我也这样做了,我已经用您的代码替换了我的代码<代码>System.out.println(“代理连接”)打印代理连接的
的倍数