Ich stand mal vor dem Problem, dass ich wie in AngularJS einen REST-Service mit JavaFX abfragen wollte. Es sollte asynchron laufen und dabei die Oberfläche nicht blockieren, so dass alles noch sehr "responsive" auf dem Benutzer wirkt.
In AngularJS hat man ja das $http-Objekt:
$http.get(url).success(callback-function);
Am Ende habe ich eine sehr primitive eigene Lösung erstellt:
public class HTTPCaller {
public HTTPCaller() {
}
public static <T> HTTPCall<T> get(String url,Class<T> clazz, HTTPCallListener<T> listener) {
HTTPCall<T> call=new HTTPCall<T>();
call.setListener(listener);
call.setMethod("get");
call.setTargetClass(clazz);
call.setUrl(url);
return call;
}
}
public interface HTTPCallListener<T> {
public void processAsyncResponse(T response);
}
public class HTTPCall<T> {
private String method = "get";
private String url = "";
private String params = "";
private ObjectMapper mapper = new ObjectMapper();
private Class<T> targetClass=null;
private T result=null;
private HTTPCallListener<T> listener=null;
public HTTPCall() {
}
public void callAsync(){
HTTPCallTask task=new HTTPCallTask(this);
new Thread(task).start();
}
public T call() {
this.result=null;
try {
URL url = new URL(this.url);
System.out.println("call url: " + url.toString());
this.result = mapper.readValue(url, this.targetClass);
}
catch (Exception e) {
e.printStackTrace();
}
return this.result;
}
public void callListener(){
if(this.listener!=null){
this.listener.processAsyncResponse(this.result);
}
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public Class<T> getTargetClass() {
return targetClass;
}
public void setTargetClass(Class<T> targetClass) {
this.targetClass = targetClass;
}
public HTTPCallListener<T> getListener() {
return listener;
}
public void setListener(HTTPCallListener<T> listener) {
this.listener = listener;
}
}
public class HTTPCallTask extends Task<Object>{
private HTTPCall<?> call=null;
public HTTPCallTask(HTTPCall<?> call) {
this.call=call;
}
@Override
protected Object call() throws Exception {
this.call.call();
return null;
}
@Override
protected void succeeded() {
this.call.callListener();
}
}
Damit ist es nun möglich ähnlich wie mit AngularJS zu arbeiten:
HTTPCaller.get(url,resultClass,listener).callAsync();
Im Listener wird processAsyncResponse() aufgerufen. Die Methode verarbeitet kann das gelieferte Ergebnis vom REST-Service.