Java 如何将变量传递到新的可运行声明中?
我有以下资料:Java 如何将变量传递到新的可运行声明中?,java,android,runnable,android-2.1-eclair,Java,Android,Runnable,Android 2.1 Eclair,我有以下资料: Runnable done = new Runnable() { public void run() { System.out.println("Hello"); } }; 然后在我的Android活动中,我会调用类似以下内容: runOnUIThread(done); 然后我就给它打电话。但是,我希望不要硬编码“Hello”,这样我就可以传递它了。否则,对于要打印的每个字符串,我必须有一
Runnable done = new Runnable()
{
public void run()
{
System.out.println("Hello");
}
};
然后在我的Android活动中,我会调用类似以下内容:
runOnUIThread(done);
然后我就给它打电话。但是,我希望不要硬编码“Hello”
,这样我就可以传递它了。否则,对于要打印的每个字符串,我必须有一个这样的声明
(这实际上是一个安卓问题,但精简为基本Java,因此更容易回答)
谢谢在Java中(我相信Android中也是如此),您可以使用匿名内部类,就像Bart van Heukelom建议的那样。
此解决方案的优点是必须编写更少的代码,并且可以访问外部类的字段和方法
但它有两个缺点:
- 变量“hello”必须是final
- 匿名类有一个外部类实例的内部引用-这意味着外部类在符合垃圾收集条件时被保留。 @请参阅:effectiveJava[JoshuaBloch],第22项:偏爱静态成员类而不是非静态成员类
class Demo {
...
private static class MyRunnable implements Runnable {
private final String message;
MyRunnable(final String message) {
this.message = message;
}
public void run() {
System.out.println(message);
}
}
public void startThread() {
MyRunnable myRunnable = new MyRunnable("Hello");
runOnUIThread(myRunnable);
}
...
}
这不是最好的方法,因为,如果您有这样的情况:public void receivedEvent(Event e){queueEvent(new Runnable(){public void run(){System.out.println(e.message)}}};}您会有一个错误。@gtoknu然后只需将参数e finalIt设置为finalIt,那么将参数设置为finalIt会有什么不同吗?请进一步解释!我考虑过重写没有final参数的方法,我应该调用另一个接收final的方法,并执行第一个方法的操作?@Gtoknu除非我错了,否则在重写或实现时可以更改参数的finality,因为它不是方法契约的一部分,只是方法体中变量的一部分。即使你不能,你也可以做
最终事件ee=e
;嗯,很高兴知道。我觉得我的C++体验让我烦恼。因为在那里,如果你发送一个函数参数的指针到另一个线程中运行的runnable,那么指向的数据可能会被破坏,访问无效内存时会出现运行时错误。是否存在多线程解决方案,其中消息
不必是最终的?本例中的最终
语句不是必需的。-但是,当您同时在mutlipe线程中使用Runable时,您必须处理并发性问题!
class Demo {
...
private static class MyRunnable implements Runnable {
private final String message;
MyRunnable(final String message) {
this.message = message;
}
public void run() {
System.out.println(message);
}
}
public void startThread() {
MyRunnable myRunnable = new MyRunnable("Hello");
runOnUIThread(myRunnable);
}
...
}