0

我正在浏览 Hello Android (Android PDF/tutorial),现在已经多次看到这种语法。有人可以向我解释一下定义 run 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 方法?

4

3 回答 3

2

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

这将为一些长时间运行的进程启动一个新线程。

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

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

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

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

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

于 2012-11-23T01:29:40.453 回答
2

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

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

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

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

于 2012-11-23T01:33:30.563 回答
1

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

于 2012-11-23T01:33:54.847 回答