Java 如何在Android中创建可运行的accept参数?

Java 如何在Android中创建可运行的accept参数?,java,android,multithreading,Java,Android,Multithreading,在iOS中,我可以将一个函数处理程序传递给另一个函数,这个函数处理程序可以接受一个参数,并在另一个方法中执行。在安卓系统中这是怎么可能的 public class func getImage(completion: (image: UIImage?) -> ()) { completion(image: image) } Utility.getImage(completion: {image in imageView.image = image }) 我知道Runn

在iOS中,我可以将一个函数处理程序传递给另一个函数,这个函数处理程序可以接受一个参数,并在另一个方法中执行。在安卓系统中这是怎么可能的

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

Utility.getImage(completion: {image in

    imageView.image = image

})

我知道
Runnable
类似于
闭包
,但它不接受参数。找到了一个如何将参数传递给可运行的
的示例,但是这里的逻辑应该在一个单独的类中实现,而不是在调用“other method”的地方,因此代码不像iOS方式那样可读。有什么想法吗?

您不需要类来创建带有参数的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中运行,就会使用您的参数。但这将是最终的变数。因此不能在runnable中更改变量。如果您想修改变量,只需将param复制到另一个变量并进行修改。

您不需要类来创建带有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中运行,就会使用您的参数。但这将是最终的变数。因此不能在runnable中更改变量。如果要修改变量,只需将param复制到另一个变量并进行修改。

在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功能接口:
公共静态void getImage(使用者完成){
完成。接受(图像);
}
// ...
//调用函数
Utility.getImage(image->imageView.image=image);
对雅诺斯的评论有几点回应:

  • 定义一个接口允许您有多个方法,例如在发生错误时调用一个方法。对于闭包,您只需要与接口中的方法一样多的块,对于接口,只需要一个接口
  • 接口可以是匿名的,正如我给出的示例中所示,但它也可以由对象实现,允许轻松重用块等
  • 在Java8中,大多数功能接口都已经定义,所以您不需要自己定义它们
  • 创建一个命名接口给它一个特定的意义和目的。当您将其作为参数接收时,您应该如何处理它是很清楚的
  • 接口方法有一些命名约定,可以帮助您理解上下文。例如,在Android中,当接口方法在
上以
开头时,它应该在主线程上被调用。它帮助a/API开发人员表达意图,b/API用户了解预期结果。自我记录,如果你愿意的话


因此,这不是一场噩梦,在许多情况下,如果您真的不想实现它,您甚至不必实现它:)

在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功能接口:
公共静态void getImage(使用者完成){
完成。接受(图像);
}
// ...
//调用函数
Utility.getImage(image->imageView.image=image);
对雅诺斯的评论有几点回应:

  • 定义一个接口允许您有多个方法,例如在发生错误时调用一个方法。对于闭包,您只需要与接口中的方法一样多的块,对于接口,只需要一个接口
  • 接口可以是匿名的,正如我给出的示例中所示,但它也可以由对象实现,允许轻松重用块等
  • 在Java8中,大多数功能接口都已经定义,所以您不需要自己定义它们
  • 创建一个命名接口给它一个特定的意义和目的。当您将其作为参数接收时,您应该如何处理它是很清楚的
  • 接口方法有一些命名约定,可以帮助您理解上下文。例如,在Android中,当接口方法在
上以
开头时,它应该在主线程上被调用。它帮助a/API开发人员表达意图,b/API用户了解预期结果。自我记录,如果你愿意的话


因此,这不是一场噩梦,在许多情况下,如果您真的不想实现它,您甚至不必实现它:)

因为我突出显示了使用自己的类方法无法读取代码。
我知道Runnable类似于blocks
,但实际上并非如此。类似于块和闭包的是功能接口。Runnable是其中之一,但有很多,您可以定义新的。您在swift中显示的内容看起来像一个简单的侦听器,您可以简单地将其定义为
公共接口ImageListener{public void on(Image);}
。或者,对于泛型:
public interface MyListener{public void on(T);}
参见这两个例子:作为旁注,您描述的内容与您链接的问题非常不同:在链接的问题中,是关于在创建runnable时传递最后一个参数,而您的问题是如何处理调用runnable时传递的参数。正如我所强调的,使用自己的类方法,代码是不可读的。
我知道runnable类似于块
。类似于块和闭包的是功能接口。Runnable是其中之一,但有很多,您可以定义新的。在swift中显示的内容看起来像一个简单的侦听器,可以简单地定义为