Если вы ищете асинхронные вызовы, вам следует обратиться к вызову этой функции в отдельном потоке.Вы можете сделать это, создав пул потоков и предложив ему выполнить этот код за вас.Затем код будет работать в фоновом режиме, пока не будет завершен, и в этом случае вы можете что-то с ним сделать.Тогда единственное, что вам нужно сделать, это обернуть его в Runnable и синхронизировать с EventQueue в конце, и все готово.
Код для выполнения:
CallBackFunction aFunction = null;
Runnable runnable = new MyRunnable(aFunction);
ExecutorService executorService = Executors.newFixedThreadPool( 1 );
executorService.execute( runnable );
Интерфейс CallBackFunction:
public interface CallBackFunction {
/**
* Function that gets called when callback is finished
*/
void callbackfinished();
}
И запускаемый:
public class MyRunnable implements Runnable {
private CallBackFunction fCallbackFunction;
public MyRunnable( CallBackFunction callbackFunction ) {
fCallbackFunction = callbackFunction;
}
@Override
public void run() {
//execute your polling code here//
if(complete){
EventQueue.invokeLater( new Runnable() {
@Override
public void run() {
fCallbackFunction.callbackfinished();
}
} );
}
}
}
Когда вы выполняете объект MyRunnable, он не будет блокировать запущенный поток.Вместо этого он будет работать на фоне.Runnable «опросит» сервер, как вы описали в своем коде.Наконец, когда опрос завершен, он вызывает CallBackFunction, чтобы уведомить об изменении полноты.
Надеюсь, это поможет.
PS: я запускаю функцию обратного вызова в очереди событий.Это может быть необходимо для вашего приложения, но если вы занимаетесь графическим интерфейсом, это может быть безопаснее.