2014-02-27 117 views
8

我一直在爲iOS編碼,並且我非常熟悉Objective-C中塊的概念。 現在我傾向於Java的Android,並試圖將一些應用程序從Android轉換爲iOS。Java中的完成處理程序?

我讀過那裏沒有Java完全等價的塊,所以我想知道什麼是實現完成處理程序或類似工作的最佳選擇。

回答

17

接口類型,一般來說。您可以使用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將可用於所有這些接口示例。)

+0

事實上,我將需要一些參數。是否可以只聲明一次'CompletionHandler'接口,然後在重寫它時重載'handle'方法? – Guilherme

+0

你會*只聲明'CompletionHandler'一次,是的,你可以使用相同的語法多次使用'handle'的不同代碼。請注意,每次你這樣做時,你實際上都會聲明一個「實現CompletionHandler」的新類,但它是一個匿名類。如果你想多次使用同一個'handle'主體,你也可以聲明一個實現它的命名類,並且你可以用'new'創建它的一個新實例,例如。 'setCompletionHandler(new CommonCompletionHandler());'。 – ajb

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()之後將整個事物放入(如果摺疊代碼,它甚至會顯示與lambda表達式類似的語法)。

這就是現在的狀態。看起來並不像很多...

+0

謝謝,這看起來正是我所需要的。還有一個簡單的問題,聲明的方法到底如何,以及如何調用處理程序? – Guilherme

+0

所有可運行的程序都有一個方法運行,這就是爲什麼Android Studio可以將它放在那裏。您也可以定義自己的匿名類,只需聲明一個接口,然後執行新的(){},它應該刪除方法或爲您提供添加方法的選項。 – Rob

+0

@Rob你到底是怎麼做到的?任何簡單的示例代碼請 – JayVDiyk