#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 работает идеально