实例化嵌套对象很麻烦

时间:2013-10-02 18:43:54

标签: java android handler

免责声明:我意识到我应该做Handler.obtainMessage();而不是自己实例化,但这段代码演示了我遇到的问题。

我有一些代码,我试图将带有字符串的消息发送到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 = NULL;这种方法;或者我应该在handleMessage方法中将它们赋值为null? (我不确定这在多线程情况下是如何工作的。)

2 个答案:

答案 0 :(得分:0)

nullyfying 那些局部变量不会受到伤害,但据我所知,即使你不这样做,垃圾收集器也能正确处理它们。请记住,为这些对象分配的内存不会被释放,至少在方法接收它们时,params完成了他们的工作。

答案 1 :(得分:0)

  

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

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

  

典型的方式是什么?

编译的那个。因此,在Bundle的情况下,您将使用后一个代码段。当您编写自己的Java类时,欢迎您提供流畅的界面,以便您可以执行类似于第一个代码段的操作。

  

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

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

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

  

或者我应该添加m = null; B = NULL;这种方法

这些没有效果。

  

我应该在handleMessage方法中将它们赋值为null吗?

由于这些是局部变量,因此handleMessage()方法中不存在这些变量,因此您无法在null中将这些局部变量设置为handleMessage()

这种东西包含在Java的教育材料中,例如书籍和课程。