0

免责声明:我意识到我应该做Handler.obtainMessage();而不是自己实例化一个,但是这段代码演示了我在使用 java.

我有一些代码试图将带有字符串的消息发送到android中的处理程序。

我首先尝试了这样的事情: mHandler.sendMessage(new Message().setData(new Bundle().putString("key","value)));

这显然没有用,它说 setData args (Bundle) 与我给它的不匹配 (void);

好的,所以 putString 必须返回 void,我猜 setData 也会返回 void,所以这是一个不好的方法。我试着像这样分解它:

Bundle b = new Bundle();
b.putString("key","value");
Message m = new Message();
m.setData(b);
listener.sendMessage(m);

这似乎是一种混乱的方式。典型的方式是什么?如果我这样做,这些对象将失去它们的引用并在方法完成时被垃圾收集,或者我应该添加 m=null; b=空;对这种方法;或者我应该在 handleMessage 方法中将它们分配为 null 吗?(我不确定这在多线程情况下是如何工作的。)

4

2 回答 2

0

消除这些局部变量不会受到伤害,但据我所知,即使您不这样做,垃圾收集器也会正确处理它们。请记住,为这些对象分配的内存不会被释放,至少在方法接收它们作为参数完成它们的工作之前。

于 2013-10-02T18:48:34.250 回答
0

这似乎是一种混乱的方式。

你当然欢迎你的意见。当您编写自己的 Java 类时,欢迎您为其提供流畅的接口,以实现您第一次尝试的编码结构。

典型的方式是什么?

编译的那个。因此,在 的情况下Bundle,您将使用后一个代码片段。当您编写自己的 Java 类时,欢迎您在它们上提供流畅的接口,以允许您做更类似于您的第一个代码片段的事情。

如果我这样做,这些对象将失去它们的引用并在方法完成时被垃圾收集

与许多垃圾收集语言(C++、Java、Ruby 和 Smalltalk,在我的脑海中仅列举四种)一样,局部变量(b以及m在您后面的代码片段中)在方法返回时超出范围。在这种情况下,它们不会被垃圾收集,因为还有对这些对象的其他引用......这通常是首先创建对象的重点。

另请注意,两个代码片段之间没有功能差异(如果MessageBundle提供了流畅的接口来编译第一个片段)。事实上,如果它们编译成相同的字节码,我一点也不感到惊讶。

或者我应该添加 m=null; b=空;对这个方法

这些在这里不会有任何影响。

我应该在 handleMessage 方法中将它们分配为 null 吗?

由于这些是局部变量,它们在您的方法中不存在handleMessage(),因此您不能将这些局部变量设置为nullin handleMessage()

这类东西在 Java 教育材料中都有介绍,例如书籍和课程。

于 2013-10-02T19:10:33.150 回答