2011-07-24 21 views
1

我是一个小菜鸟学习Android通过一本书,我有一个快速的问题。我的书代码非常简单,看起来像这样: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中执行鼠标操作会给我一个消息,听起来像是乱码。
它试图“获得”什么信息?

+0

的sendMessage应该发送一个简单的字符串。所以我认为obtainMessage()应该检索你自己的常量字符串。 – papachan

回答

3

如描述的in the docs,它从消息池获得消息而不是创建新消息。 (无论如何您都需要向处理程序发送消息):

从全局消息池中返回一条新消息。比创建和分配新实例更高效 。检索到的消息具有 其处理程序设置为此实例(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); 
+0

是的,这就是我通过谷歌和Eclipse(我在OP中写的)遇到的解释,我对它的理解太差。你能再解释一下吗? – Ryan

+0

@Ryan - 见编辑。 – MByD

+0

谢谢!这更有意义,我已经选择了你的答案,但是如果你只能回答我一个相关的问题,我会很感激......现在,我没有任何具体的消息(如你所说),我怎么能具体的东西?我尝试在sendmessage中发送一个int,但那不起作用... – Ryan