Gluon Attach - PicturesService 同步获取照片(阻塞方式)

问题描述 投票:0回答:1

我正在尝试Gluon 的 Attach PicturesService,以便从图库或直接从 iPhone 的相机读取照片。似乎有两种方法可以实现此目的,分别是 asyncLoadImageFromGallery()asyncTakePhoto(boolean savePhoto)。但是,我想调用此方法并以阻塞方式获取结果,例如 JavaFX 接口等待用户完成本机 iOS 进程。在 API 中,调用是异步完成的,您需要添加一个侦听器才能捕获用户选择的照片。

private File imageFile;

public void getImageFromGallery() {

   PicturesService.create().ifPresent(service -> {
      service.imageProperty().addListener((obs, ov, image) -> {
          if (image != null) 
              service.getImageFile().ifPresent(file -> imageFile = file);
      });
      service.asyncLoadImageFromGallery();
  });

} // getImageFromGallery()

有没有办法同步执行此操作,以便我可以运行如下代码?

public File getImageFromGallery() {
  File imageFile;

  /* Use PictureService to get Image and return it */
}

我尝试过已弃用的方法 loadImageFromGallery()takePhoto(boolean savePhoto),但不幸的是这些根本不起作用。

java javafx gluon gluon-mobile
1个回答
0
投票

目前还不清楚这到底是不是一个好主意:阻塞 UI 线程从来都不是一件好事。但是,您可以使用

来做到这一点
public File getImageFromGallery() throws InterruptedException {

   BlockingQueue<File> queue = new ArrayBlockingQueue<>(1);

   PicturesService.create().ifPresent(service -> {
      service.imageProperty().addListener((obs, ov, image) -> {
          if (image != null) 
              service.getImageFile().ifPresent(queue::add);
      });
      service.asyncLoadImageFromGallery();
   });

   return queue.take();

}

更好的办法可能是将其封装为一个任务,阻塞后台线程。在任务运行时禁用 UI,并在任务完成时重新启用它。使用与上面相同的

getImageFromGallery()
方法,执行以下操作:

Task<File> task = new Task<>() {

    @Override
    public File call() throws Exception {
        return getImageFromGallery();
    }

};
task.setOnSucceeded(e -> {
    File file = task.getValue();
    // enable UI, something like
    // someButton.getScene().getRoot().setDisable(false);.
    // do what you need with file
});
Thread thread = new Thread(task);
thread.start();

我不知道

PictureService
API,但看起来
PictureService
可能会返回
null
。您应该处理这种情况,因为它会使 UI 无限期地挂起(或禁用)。

© www.soinside.com 2019 - 2024. All rights reserved.