如何在蓝牙操作期间显示进度对话框

How to display progress dialog during bluetooth actions

我目前正在尝试 rotate/change 单击按钮时的颜色。 此按钮从我的 Arduino 上的传感器检索数据并将其显示在 phone 上,它最多需要 10 秒,所以我想在单击按钮时显示某些东西是 运行。

我面临的问题是蓝牙操作似乎利用了 phone 上的显示,无论我尝试什么方法,所以 animation/color 开关在检索数据时发生,这是不是我要找的。

这是我的代码:

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);*/

            }
    });

我试了几种方法,我猜是蓝牙部分的问题,但是不知道怎么解决。

有什么想法吗?

谢谢

您正在尝试对 Main-UI thread 执行 IO 操作。在主线程上执行任何类型的阻塞操作都会导致您的应用冻结。

您需要将与蓝牙通信的代码移至后台线程。

以下是一些可能对您有所帮助的参考资料: 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。 Kotlin 有比 Java 更简单的后台操作方法。因此,如果您真的想使用最新技术,我建议您多探索 Kotlin。