Как отобразить диалоговое окно хода выполнения во время действий Bluetooth

#android #bluetooth #android-bluetooth

Вопрос:

В настоящее время я пытаюсь повернуть/изменить цвет кнопки при ее нажатии. Эта кнопка извлекает данные с датчиков на моем Arduino и отображает их на телефоне, это занимает до 10 секунд, поэтому я хотел бы показать, что что-то работает при нажатии кнопки.

Проблема, с которой я сталкиваюсь, заключается в том, что действия Bluetooth, похоже, используют преимущества дисплеев на телефоне, какой бы метод я ни использовал, поэтому переключение анимации/цвета происходит при извлечении данных, а это не то, что я ищу.

Вот мой код:

 brefresh.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // TRIED WITH START ANIMATION BUT IT STARTS WHEN BLUETOOTH PART IS FINISHED
            /* Animation rotate_brefresh = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.rotate_clockwise);
            brefresh.startAnimation(rotate_brefresh);
             */

            // SAME FOR JUST SETTING BACKGROUND IMAGE OF THE BUTTON IN ANOTHER COLOR
            /*brefresh.setBackgroundResource(R.drawable.brefresh_red);
            System.out.println("aa"); */ 
            
            
            // FINALY SAME WHEN DISPLAYING A PROGRESS DIALOG, IT SHOWS UP WHEN BLUETOOTH STUFF IS FINISHED
            progress = new ProgressDialog(MainActivity.this);
            progress.setTitle("Récolte des informations");
            progress.setMessage("Cela prend quelques secondes");
            progress.setCancelable(false);

            progress.show();
            
            
            // BEGINS OF BLUETOOTH STUFF
                BluetoothSocket btSocket = null;
                try {
                    btSocket = hc05.createRfcommSocketToServiceRecord(mUUID);
                    btSocket.connect();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                InputStream inputStream = null;
                try {
                    inputStream = btSocket.getInputStream();
                    inputStream.skip(inputStream.available());
                    String s1 = ""; //premier textview
                    String s2 = ""; //deuxième textview
                    byte b;

                    do {
                        b = (byte) inputStream.read();

                        s1 = s1   (char) b;

                    }

                    while (b != 94); // 94 c'est ^

                    do {
                        b = (byte) inputStream.read();

                        s2 = s2   (char) b;

                    }

                    while (b != 59); // 59 c'est ;

                    s1 = s1.replace("^", "");
                    s2 = s2.replace(";", "");

                    tvpH.setText("- pH de : "   s1);
                    tvHumidity.setText("- Humidité relative de : "   s2);


                } catch (IOException e) {
                    e.printStackTrace();
                }


                try {
                    btSocket.close();
                    System.out.println(btSocket.isConnected());
                } catch (IOException e) {
                    e.printStackTrace();
                }

                /*brefresh.setBackgroundResource(R.drawable.brefresh);*/

            }
    });
 

Поскольку я попробовал несколько методов, я предполагаю, что проблема связана с частью Bluetooth, но я понятия не имею, как ее решить.

Есть Какие-Нибудь Идеи?

Спасибо

Ответ №1:

Вы пытаетесь выполнить операцию ввода-вывода в основном потоке пользовательского интерфейса. Выполнение любых операций блокировки в основном потоке приведет к зависанию вашего приложения.

Вам нужно переместить код для связи с Bluetooth в фоновый поток.

Вот некоторые ссылки, которые могут вам помочь: https://developer.android.com/guide/topics/connectivity/bluetooth/transfer-data
https://medium.com/swlh/create-custom-android-app-to-control-arduino-board-using-bluetooth-ff878e998aa8

P.S. У Котлина есть более простые способы выполнения фоновых операций, чем Java. Итак, если вы действительно хотите использовать новейшие технологии, я бы посоветовал подробнее изучить Котлин.

Комментарии:

1. Спасибо за ваш ответ. Это приложение-всего лишь простой прототип курса, не связанного с программированием. Я на самом деле не изучаю программирование, поэтому я просто хочу, чтобы все было как можно проще, и я нахожу то, что мне идеально подходит, тост с Android работает идеально