Какова задача метода obtainMessage(int what, int arg1, int arg2) в обработчике

#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.*/
 

попробуйте сопоставить ваш запрос с этим и посетите
этот веб-сайт

Надеюсь, это поможет