在Java Android项目中如何调用Kotlin库FotoApparat的whenAvailable方法?
在Java中调用FotoApparat的异步回调逻辑
刚好我之前处理过类似的跨Kotlin/Java调用的场景,其实核心是理解Kotlin高阶函数在Java中的兼容方式。FotoApparat的whenAvailable方法在Kotlin里接收一个函数类型参数,到了Java里会被转换成带有invoke方法的函数接口(比如Function1<BitmapPhoto, Unit>),我们只需要实现这个接口就能处理异步回调了。
下面直接给你两种Java实现方式:
1. 匿名内部类写法(兼容Java 7及以下)
这种写法不需要Java 8的lambda支持,兼容性更好:
// 先获取拍照结果 PhotoResult photoResult = fotoapparat.takePicture(); // 异步保存到文件的Java写法和Kotlin逻辑一致 photoResult.saveToFile(someFile); // 转换为Bitmap并处理异步回调 photoResult.toBitmap() .whenAvailable(new Function1<BitmapPhoto, Unit>() { @Override public Unit invoke(BitmapPhoto bitmapPhoto) { // 在这里处理获取到的BitmapPhoto ImageView imageView = findViewById(R.id.your_image_view_id); if (bitmapPhoto != null) { imageView.setImageBitmap(bitmapPhoto.bitmap()); } // Kotlin的Unit对应Java的void,这里必须返回Unit.INSTANCE return Unit.INSTANCE; } });
2. Lambda写法(Java 8+推荐)
如果你的项目已经支持Java 8,用lambda会更简洁:
PhotoResult photoResult = fotoapparat.takePicture(); photoResult.saveToFile(someFile); photoResult.toBitmap() .whenAvailable(bitmapPhoto -> { ImageView imageView = findViewById(R.id.your_image_view_id); if (bitmapPhoto != null) { imageView.setImageBitmap(bitmapPhoto.bitmap()); } return Unit.INSTANCE; });
注意事项
要确保你的Android项目配置了Java 8支持,否则lambda和部分函数接口会报错,在模块的build.gradle里添加以下配置:
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } }
内容的提问来源于stack exchange,提问作者Aviran
相关产品推荐
相关产品推荐

