#java #android
#java #Android
Вопрос:
Я новичок и пытаюсь понять исходный код BluetoothChat.В BluetoothChatService я столкнулся с некоторой проблемой для понимания.
public static final int STATE_NONE = 0; // we're doing nothing
public static final int STATE_LISTEN = 1; // now listening for incoming connections
mState = STATE_NONE;
private synchronized void setState(int state) {
if (D) Log.d(TAG, "setState() " mState " -> " state);
mState = state;
// Give the new state to the Handler so the UI Activity can update
mHandler.obtainMessage(BluetoothChat.MESSAGE_STATE_CHANGE, state, -1).sendToTarget();
}
Когда я разрешаю включить свой Bluetooth, он отображается в logcat "setState() 0 -> 1"
.Но я не могу понять, как состояние становится «1»?
На официальном сайте Android я обнаружил, что obtainMessage — это метод, состоящий из 3 аргументов типа — obtainMessage(int what, int arg1, int arg2)
Может кто-нибудь, пожалуйста, объяснить, как работает это obtainMessage?
Экспертам JavaExperts нужна ваша помощь, чтобы понять приведенные выше строки.
Комментарии:
1. Это API для Android? Если да, пожалуйста, отметьте соответствующим образом.
2. Извините, теперь он отредактирован.
Ответ №1:
Понимание: например, у вас есть обработчик в вашем основном потоке
Handler uiHandler;
и внутри onCreate(BundlesavedInstanceState) у вас есть
uiHandler=new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
}
}
мы знаем, что поток пользовательского интерфейса или основной поток приложения
имеет встроенный механизм Looper.prepare() и Looper.loop()
который нам не нужно делать, как мы делаем для других потоков, и у нас есть другой класс с рабочим потоком (определяемый пользователем поток)
public class MyThread {
Thread thread=new Thread(new
Runnable(){
@Override
public void run(){
Message
message=uiHandler.obtainMessage();
///
///
uiHandler.sendMessage(message);
}
}).start();
}
В приведенном выше коде цель UiHandler.obtainMessage()
заключается в том, что мы знаем, что поток пользовательского интерфейса связан с
очередью сообщений.Чтобы отправить сообщение в эту очередь сообщений
, нам нужен адрес ячейки в этой очереди сообщений.
uiHandler.obtainMessage();/*takes an
address of that cell(Message object) and
gives that to message.*/
Наконец
uiHandler.sendMessage(message) /*sends the
message to message queue.*/
попробуйте сопоставить ваш запрос с этим и посетите
этот веб-сайт
Надеюсь, это поможет