如果执行网络请求,我想从ControlsFx显示MaskerPane。如果请求仍在运行,它应该是一个指示器。此外,我想在后台运行网络请求,因此窗口不会冻结。
private void search(String searchTerm, boolean tvShow){
masker.setVisible(true);
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<List<String>> callable = new Callable<List<String>>() {
@Override
public List<String> call() throws Exception {
return tmdbWrapper.search(searchTerm, tvShow);
}
};
Future<List<String>> future = executor.submit(callable);
executor.shutdown();
try {
System.out.println(future.get().toString());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
System.out.println("finally");
masker.setVisible(false);
}
问题是,在请求完成之前,MaskerPane不会显示。
tmdbWrapper是tmdb Api的包装器。
如果我会做这样的事情
new Thread(){
@Override
public synchronized void run(){
masker.setVisible(true);
System.out.println(tmdbWrapper.search(searchTerm, tvShow));
masker.setVisible(false);
}
}.start();
它会起作用。因为编码风格不好而且不会是FX应用程序线程我不希望它这样做。