2012-09-10 49 views
3

我想开始在iPhone应用程序中使用块,因为它们确实非常方便。需要将iOS中使用的块转换为Android Java代码

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

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

非常感谢!

+0

快速浏览一下块的iOS做什么建议,你可以使用匿名类和注解获得的大部分功能。 –

回答

3

Java允许匿名(未命名)类。而且,他们可以扩展另一个班级。当以这种方式使用时,它们与目标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对象来产生它作为一个线程。)

这里有进一步的讨论:

Limitations of Java Anonymous Classes compared to Objective-C Blocks

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

+0

,所以它看起来相当于bocks - 但是有没有我看不到的一般差异? – user387184

+0

我已更新我的答案并添加了两个方便的链接。 – occulus

+0

超级!非常感谢你! – user387184

2

是的,可悲的是Java没有关闭。对于每个块,您都必须将其转换为某种回调机制。这是Java中需要的令人讨厌的样板。你必须不断地做的东西一样

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

所以,你必须创建一个匿名接口,覆盖的方法,然后把你的东西在里面,当你真的希望能够做的是一样的东西:

button.onClick(doSomething();); 
+0

但正如occulus解释的那样 - 似乎匿名类可以用作块的替代 – user387184

+0

uh @ user387184,这就是为什么我说“对于每个块,您都必须将其转换为某种回调机制“...我只是表现出Java中没有任何块是多么令人讨厌...... – LuxuryMode

1

这个怎么样

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

如Android的Runnable类表示可以像上面那样执行的命令(在单独的线程中)

它基本上是使用“Command”设计模式实现的。

public interface Command { 
    void execute(); 
} 
-1

这很容易。

iOS块 - 它已关闭。所以,Java也有关闭。我为两种平台开发 - iOS & Android - 我知道 - 这是真的。

请看维基百科文章http://en.wikipedia.org/wiki/Closure_(computer_science) - 有代码示例为iOS & Android。

+0

该页面上没有适用于Android的代码示例;单词“android”甚至不会出现在页面上。您还会注意到该页面的Java在“类似于闭包的结构”中列出,其中包含诸如“某些语言的特性模拟闭包的某些功能”以及“为Java添加更多全功能闭包而提出的一些建议” 。 – CommonsWare

+0

无所谓,这只是一个示例如何将iOS块转换为基于Java的项目 –

+0

请显示这样的示例,其中具有参数和上下文变量的块被移植到Java - 我没有在该页上找到任何 – user387184