Android, быстрый вопрос из моей книги - PullRequest
1 голос
/ 24 июля 2011

Я нуб, изучаю Android через книгу, у меня быстрый вопрос. Код моей книги довольно прост и выглядит так:

Мой обработчик:

 Handler handler=new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
      bar.incrementProgressBy(5); 
              } 
  }; 

Моя тема:

Thread background=new Thread(new Runnable() { 
          public void run() { 
            try { 
              for (int i=0;i<20 && isRunning.get();i++) { 
                Thread.sleep(1000); 
                handler.sendMessage(handler.obtainMessage()); 
              } 
            } 
            catch (Throwable t) { 
              // just end the background thread 
            } 
          } 
        }); 

Мой вопрос здесь:

handler.sendMessage(handler.obtainMessage());

Что за чертовщина "handler.obtainMessage ()"?
При наведении указателя мыши в Eclipse появляется сообщение, которое звучит как бред.
Какое сообщение он пытается «получить»?

1 Ответ

3 голосов
/ 24 июля 2011

Как описано в документации , он получает сообщение из пула сообщений вместо создания нового.(вам все равно нужно отправить сообщение обработчику):

Возвращает новое сообщение из глобального пула сообщений.Более эффективно, чем создание и выделение новых экземпляров.Полученное сообщение имеет свой обработчик, установленный на этот экземпляр (Message.target == this).Если вам не нужна эта возможность, просто вызовите Message.obtain ().

Я попытаюсь уточнить:

Вы отправляете сообщение обработчику.Сообщение добавляется в очередь потока обработчика и обрабатывается в исходном потоке.Вам нужно отправить ему сообщение, хотя в сообщении, которое оно использует, нет ничего конкретного (в соответствии с кодом вашего обработчика), поэтому вы просто отправляете пустое сообщение, но вместо выделения памяти для нового сообщения, оно берется изпул сообщений, который быстрее.

Надеюсь, это прояснит ситуацию.

Относительно того, как установить сообщение с помощью int:

Message m = new Message();
Bundle b = new Bundle();
b.putInt("what", 5); // for example
m.setData(b);
handler.sendMessage(m);
...