Java中的完成处理程序?

时间:2014-02-27 19:02:50

标签: java completionhandler

我一直在为iOS编码,我对Objective-C中的块概念非常熟悉。 现在我正在使用Java for Android并尝试将一些应用程序从Android转换为iOS。

我读到Java中没有完美的块相当,所以我想知道实现完成处理程序或任何类似工作的最佳替代方法。

2 个答案:

答案 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所具有的语法)。

这就是现在的状态。没有多少人看起来好像......