如何在蓝牙操作期间显示进度对话框
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。
我目前正在尝试 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。