Java,你怎么称呼这个?为什么)};

时间:2012-11-23 01:27:41

标签: java android

我正在浏览Hello Android(Android PDF / tutorial),现在已经看过几次这种语法了。有人可以向我解释运行Runnable时使用的Java语法是什么?

private class AndroidBridge {

    public void callAndroid(final String arg) { // must be final
        handler.post(new Runnable() {
            public void run() {
                Log.d(TAG, "callAndroid(" + arg + ")" );
                textView.setText(arg);
            }
            ...

代码是否定义了Runnable对象并覆盖了它的run方法?

3 个答案:

答案 0 :(得分:2)

.post方法需要一个Runnable对象,该对象在您的代码示例中被匿名声明并作为参数传递。

这将为一些长期运行的过程启动一个新线程。

线程构造函数需要一个Runnable对象,该对象具有在线程准备就绪时调用的run方法。

当许多Java应用程序启动时,所有操作都堆积在一个线程上,包括UI。我主要使用线程来避免在我做“重”的事情时冻结UI。

当您点击“执行”或其他内容时,您已经看到了这种情况,并且UI突然响应不足。这是因为当前线程没有足够的资源来构建UI并执行“执行”要求的任何内容。

所以,有时这是在其他地方,在需要Runnable对象的不同线程上完成的。

值得注意的是,多线程(你故意制作多个线程)是众所周知难以使用的,主要是出于调试原因,IMO。但它当然是一个有用的工具。

答案 1 :(得分:2)

正如Dave Newton所说,这是一个实现Runnable接口的匿名内部类。

至于为什么人们会想要使用它,它可以被认为是各种语法糖。您会注意到,在您的示例中,run()中的代码可以访问与定义匿名内部类本身相同的范围。

这简化了对这些成员的访问,就像你在外部定义了类一样,你必须传入对你想要调用/使用其成员的任何对象的引用。

事实上,IIRC,这实际上是Java编译匿名内部类时发生的事情;如果有对外部包含类的引用,编译器将创建一个构造函数,该构造函数传入对包含外部类的引用。

答案 2 :(得分:1)

代码定义了一个实现Runnable接口的匿名内部类,并实现了run方法来执行适当的操作。