Почему BluetoothSocket.connect () вызывается перед Toast.makeText (). Show ()? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь показать сообщение Toast непосредственно перед попыткой подключения к устройству Bluetooth, которое я выбрал в своем ListView, но проблема в том, что после подключения появляется сообщение Toast, чтобы пользователь могзнать, пытается ли их устройство в данный момент подключиться к выбранному устройству BT.Это должно быть примерно так:

  • Устройство выбрано из ListView
  • Тостовое сообщение: "Соединение ..."
  • btSocket.connect() был вызван иустановил успешное соединение
  • Тостовое сообщение: «Подключено!»

Вместо этого происходит следующее:

  • Устройство выбрано из ListView
  • btSocket.connect() был вызван и установил успешное соединение
  • Тостовое сообщение: «Подключен!»
  • Тостовое сообщение: «Подключается ...»

Обратите внимание, что приложение зависает при попытке подключения к btSocket, затем размораживается и продолжает свою работу.

Пример кода:

listView_myDevices.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        BluetoothSocket btSocket;

        // ... Determine which device is selected, etc.

        Toast.makeText(MyActivity.this, "Connecting...", Toast.LENGTH_SHORT).show();

        btSocket.connect();

        Toast.makeText(MyActivity.this, "Connected!", Toast.LENGTH_SHORT).show();

        // ...
    }

});

1 Ответ

1 голос
/ 02 июля 2019

Проблема в том, что соединение может занять немного времени, и вы должны убедиться, что Toast-CONNECTED срабатывает ТОЛЬКО после его подключения. Самое быстрое решение, но НЕ ЛУЧШЕЕ, будет

BluetoothSocket btSocket;
        Toast.makeText(MyActivity.this, "Connecting...", Toast.LENGTH_SHORT).show();
        btSocket.connect();


    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (btSocket.isConnected()){
                Toast.makeText(MyActivity.this, "Connected!", Toast.LENGTH_SHORT).show();
            }            }
    }, 5000);

Таким образом, вы даете время для соединения и проверяете его через 5 секунд

...