【问题标题】:Android, quick question from my bookAndroid,我书中的快速问题
【发布时间】:2011-10-11 21:23:35
【问题描述】:

我是一个通过书籍学习 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 中鼠标悬停会给我一条听起来像胡言乱语的消息。
它试图“获得”什么信息?

【问题讨论】:

  • sendMessage 应该发送一个简单的字符串。所以我认为 gainMessage() 应该检索您自己的常量字符串。

标签: android multithreading messaging


【解决方案1】:

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);

【讨论】:

  • 是的,这也是我通过 google 和 Eclipse(我在 OP 中写的)得到的解释,我不太明白。你能解释一下吗?
  • 谢谢!这更有意义,我选择了你的答案,但如果你能回答我一个相关的问题,我将不胜感激......现在我在消息中没有任何具体内容(如你所说),我怎么能有具体的东西?我尝试在 sendmessage 中发送一个 int,但没有成功...
  • 我编辑了我的代码以查看消息是什么:tView1.setText("r:"+msg);它向我展示了“什么”和“何时”,所以我试图通过传递一个 int 来改变“什么”的值,但它不起作用:(
  • 您需要创建一个消息对象并将int 放入其捆绑包中。我将在答案中添加几行,但我必须去......
  • 啊哈!这为我打开了它,非常感谢你的帮助,祝你有美好的一天!
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2012-08-15
  • 2012-02-29
  • 2018-01-31
相关资源
最近更新 更多