3

我想开始在我的 iPhone 应用程序中使用块,因为它们真的很方便。

然而,由于所有应用程序也必须移植到 Android Java,我不确定这是否是一个好主意,因为我不知道如何轻松翻译这些块。

到目前为止,将 iOS 移植到 Android 是直截了当的,几乎是一行一行的——但是 iOS 块如何转换为 Java 呢?(当然我不是在谈论 Java 块)

非常感谢!

4

4 回答 4

3

Java 允许匿名(未命名)类。更重要的是,他们可以扩展另一个类。当以这种方式使用时,它们类似于 Objective C 中的块。

您经常会看到定义的匿名类实现Runnable或类似。这与块类似:提供匿名的内联代码定义,该代码在某处传递以供以后使用。

有关更多信息,请参阅此处的示例: http ://en.wikipedia.org/wiki/Closure_%28computer_science%29#Local_classes_.28Java.29

因此,在 Java 中,您可以编写如下内容:

doMyThing(new Runnable() {
  void run() {
     // your 'block' code here
  }
});

该方法doMyThing可以稍后调用 run 方法(或通过将 Runnable 传递给新的 Thread 对象等将其作为线程生成)

这里有进一步的讨论:

与 Objective-C 块相比,Java 匿名类的局限性

http://www.jondev.net/articles/Objective-C_blocks_vs_Java_Anonymous_Classes_or_Functions_(callbacks)

于 2012-09-10T19:33:45.557 回答
2

是的,遗憾的是 Java 没有闭包。对于每个块,您必须将其转换为某种回调机制。这是 Java 中需要的烦人的样板文件。你必须经常做类似的事情

   button.setOnClickListener(
      new View.OnClickListener() { 
        public void onClick(View v) { 
           doSomething();)
      }
  });

所以你必须创建一个匿名接口,重写方法,然后把你的东西放在那里,当你真正想做的是:

button.onClick(doSomething(););
于 2012-09-10T19:29:27.563 回答
1

那这个呢

yourObj.passABlock(new actionBlock() {
    public void action() {
        //Whatever
    }
});

例如,Android 的Runnable类代表一个可以像上面一样执行的命令(这在一个单独的线程中)

它本质上是使用“命令”设计模式实现的。

public interface Command {
   void execute();
}
于 2012-09-10T19:30:02.810 回答
-1

这简单。

iOS 阻塞 - 它是关闭的。所以,Java也有闭包。我为这两个平台开发 - iOS 和 Android - 我知道 - 这是真的。

请查看维基百科文章http://en.wikipedia.org/wiki/Closure_(computer_science ) - 有适用于 iOS 和 Android 的代码示例。

于 2012-09-10T19:30:26.237 回答