2016-09-28 165 views
1

在iOS中,我可以將函數處理函數傳遞給其他函數,並且此函數處理函數可以接受一個參數,並且可以在另一個方法中執行。 Android如何可能?如何在Android中創建接受參數的Runnable?

public class func getImage(completion: (image: UIImage?) ->()) { 
    completion(image: image) 
} 

Utility.getImage(completion: {image in 

    imageView.image = image 

}) 

我知道Runnable類似於blocksclosures,但它不接受的說法。找到here一個示例如何將參數傳遞給Runnable,但這裏的邏輯應該在一個單獨的類中實現,而不是在其他方法被調用的地方,所以代碼不像iOS中那樣可讀取。任何想法?

+0

正如我強調的代碼是不是** **讀採用自己的班級方式。 –

+0

'我知道Runnable類似於塊'不是真的。類似於塊和閉包的是什麼?功能接口*。 Runnable就是其中之一,但有很多,你可以定義新的。你在swift中顯示的東西看起來像一個簡單的監聽器,你可以簡單地定義爲'public interface ImageListener {public void on(Image image); }'。或者,對於通用性:'public interface MyListener {public void on(T t); }' – njzk2

+0

看到例如這兩個:https://github.com/smaspe/FunctionalIterables/blob/master/src/main/java/com/smaspe/iterables/FuncIter.java#L280 – njzk2

回答

1

在Java中,您需要先聲明接口。您不能簡單地在使用它的函數的簽名中聲明函數接口。所以,你的SWIFT代碼會翻譯爲:

// In java 7 
// Declare your interface 
public interface ImageListener { 
    public void completed(Image image); 
} 

// ... 
// Define your `getImage` function to use the listener 
public static void getImage(ImageListener completion) { 
    completion.completed(image); 
} 

// ... 
// Call the function 
Utility.getImage(new ImageListener() { 
    public void completed(Image image){ 
     imageView.image = image; 
    } 
}); 

或者與Java 8,只需:

// Skip the interface declaration and use a predefined Java 8 Functional interface: 
public static void getImage(Consumer<Image> completion) { 
    completion.accept(image); 
} 

// ... 
// Call the function 
Utility.getImage(image -> imageView.image = image); 

幾個點到亞諾什意見作出迴應:

  • 定義的界面允許您有幾種方法,例如發生錯誤時調用的方法。使用閉包只需要儘可能多的塊,因爲在界面中有方法,需要一個界面。
  • 該接口可以是匿名的,就像我給出的例子,但它也可以通過一個對象實現,從而可以方便地重用塊等等。
  • 在Java 8中,大多數功能接口已經定義好了,所以你不需要自己定義它們。
  • 創建一個接口的命名爲它提供了一個特定的含義和目的。當你將它作爲參數接收時,你應該怎麼處理它。
  • 有一些接口方法的命名約定可以幫助你理解上下文。例如,在Android中,當接口方法以on開頭時,預計會在主線程上調用。它有助於API的開發人員表達意圖,並幫助API的用戶知道期望的內容。自我記錄,如果你願意。

所以,不是噩夢,而且在許多情況下,你甚至沒有實現它,如果你真的不想:)

+0

@János我在你的評論 – njzk2

+0

上編了幾個備註的答案謝謝,我花了一些時間來理解你的例子,但是我現在看到只有接口文件是Swift所需要的,我可以使用它。 :)重要的是'邏輯'不需要分離出來,但可以保存在'onBindViewHolder'方法中。 –

2

你不需要一個類來創建params的runnable。在這裏,我分享瞭如何使用params使用runnable。

private Runnable createRunnable(final String params) { 
    return new Runnable() { 
     @Override 
     public void run() { 
      // your code to run in background 
      // Use your param here 
     } 
    }; 
} 

使用像這樣的方法來創建帶有參數的runnable。您的參數將在可運行時隨時使用。但這將是最後的變數。所以你不能改變runnable中的變量。如果你想修改變量,你只需將param複製到另一個變量並修改即可。

相關問題