免责声明:我意识到我应该做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? (我不确定这在多线程情况下是如何工作的。)
答案 0 :(得分:0)
nullyfying 那些局部变量不会受到伤害,但据我所知,即使你不这样做,垃圾收集器也能正确处理它们。请记住,为这些对象分配的内存不会被释放,至少在方法接收它们时,params完成了他们的工作。
答案 1 :(得分:0)
这似乎是一种混乱的方式。
您当然欢迎您的意见。当您编写自己的Java类时,欢迎您提供流畅的接口,以实现您首次尝试的编码结构。
典型的方式是什么?
编译的那个。因此,在Bundle
的情况下,您将使用后一个代码段。当您编写自己的Java类时,欢迎您提供流畅的界面,以便您可以执行类似于第一个代码段的操作。
如果我这样做,这些对象将丢失其引用并在方法完成时被垃圾收集
与许多垃圾收集语言(C ++,Java,Ruby和Smalltalk,在我的脑海中列举四个)一样,后一个代码段中的局部变量(b
和m
)方法返回时超出范围。在这种情况下,它们不会被垃圾收集,因为还有其他对这些对象的引用......这通常是首先创建对象的重点。
另请注意,两个代码段之间没有功能差异(如果Message
和Bundle
提供了流畅的接口来进行第一个代码段编译)。事实上,如果他们编译成相同的字节码,我至少不会感到惊讶。
或者我应该添加m = null; B = NULL;这种方法
这些没有效果。
我应该在handleMessage方法中将它们赋值为null吗?
由于这些是局部变量,因此handleMessage()
方法中不存在这些变量,因此您无法在null
中将这些局部变量设置为handleMessage()
。
这种东西包含在Java的教育材料中,例如书籍和课程。