我一直在爲iOS編碼,並且我非常熟悉Objective-C中塊的概念。 現在我傾向於Java的Android,並試圖將一些應用程序從Android轉換爲iOS。Java中的完成處理程序?
我讀過那裏沒有Java完全等價的塊,所以我想知道什麼是實現完成處理程序或類似工作的最佳選擇。
我一直在爲iOS編碼,並且我非常熟悉Objective-C中塊的概念。 現在我傾向於Java的Android,並試圖將一些應用程序從Android轉換爲iOS。Java中的完成處理程序?
我讀過那裏沒有Java完全等價的塊,所以我想知道什麼是實現完成處理程序或類似工作的最佳選擇。
接口類型,一般來說。您可以使用Runnable
(這是一個interface
),正如Rob建議您的處理程序沒有參數和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 lambda將可用於所有這些接口示例。)
你可以做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()之後將整個事物放入(如果摺疊代碼,它甚至會顯示與lambda表達式類似的語法)。
這就是現在的狀態。看起來並不像很多...
事實上,我將需要一些參數。是否可以只聲明一次'CompletionHandler'接口,然後在重寫它時重載'handle'方法? – Guilherme
你會*只聲明'CompletionHandler'一次,是的,你可以使用相同的語法多次使用'handle'的不同代碼。請注意,每次你這樣做時,你實際上都會聲明一個「實現CompletionHandler」的新類,但它是一個匿名類。如果你想多次使用同一個'handle'主體,你也可以聲明一個實現它的命名類,並且你可以用'new'創建它的一個新實例,例如。 'setCompletionHandler(new CommonCompletionHandler());'。 – ajb