我一直在为iOS编码,我对Objective-C中的块概念非常熟悉。 现在我正在使用Java for Android并尝试将一些应用程序从Android转换为iOS。
我读到Java中没有完美的块相当,所以我想知道实现完成处理程序或任何类似工作的最佳替代方法。
答案 0 :(得分:23)
一般来说,接口类型。如果您的处理程序没有参数和Runnable
返回类型,则可以使用interface
(这是void
)。但是很容易定义自己的:
interface CompletionHandler {
public void handle(String reason);
}
然后将其传递给您自己的班级:
something.setCompletionHandler(new CompletionHandler() {
@Override
public void handle(String reason) {
...
}
});
在另一堂课:
void setCompletionHandler(CompletionHandler h) {
savedHandler = h;
}
然后只需调用方法调用它:
savedHandler.handle("Some mysterious reason");
这种事情是为Java Swing和Android库中的“听众”所做的;例如,请参阅View.OnClickListener
。
(P.S。我相信Java 8 lambdas可用于所有这些接口示例。)
答案 1 :(得分:3)
你可以做runnables。显然,块的等价物将需要使用Java 8中的lambdas,但谁知道Android支持它们之前多久(它们仍在使用JUnit 3.8)。
Android中有很多地方可以像块一样完成任务,例如:
this.currentConditionsActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
currentConditionsActivity.onLocationChanged(...);
}
});
instrumentation.waitForIdleSync();
setupViewElements();
正如您所看到的,您必须创建一个匿名类的实例,但在大多数IDE中,通过自动填充来缓解样板的愚蠢。这是在Android Studio中完成的,它在完成新的Runnable()之后将整个事情放入其中(如果你折叠代码,它甚至会显示类似于lambdas所具有的语法)。
这就是现在的状态。没有多少人看起来好像......