2016-09-28 166 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复制到另一个变量并修改即可。

相关问题