Как отложить кусок кода до окончания обратного звонка?
В методе мне нужно вызвать некоторый код, но после вызова метода. Как мне это сделать?
// this call needs to happen after the return true call
xmlRpcClient.invoke("newDevices", listDeviceDesc);
return true;
4 ответа
Как сказал Джон Хопкинс try{return true;}finally{yourCode}
выполнить коду после вызова return. Но имхо это не продумано должным образом и я бы изменил дизайн программы. Можете ли вы рассказать нам немного больше о том, что вы думаете за этим, чтобы понять свой путь?
Что вы, вероятно, хотите сделать:
public void myMethod() {
return true;
}
if(myMethod()) {
client.invoke()
}
Вы можете использовать анонимный поток, чтобы достичь того, что вы хотите, и добавить одну секунду задержки внутри.
try{return true;}finally{yourCode}
не будет делать трюк, так как, наконец, будет выполнен, прежде чем метод на самом деле возвращает.
new Thread() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// this call needs to happen after the return true call
xmlRpcClient.invoke("newDevices", listDeviceDesc);
}
}.start();
return true;
Я читал на finally
блок в Java, и я узнал, что он всегда будет выполняться, если JVM не падает или System.exit()
называется. Дополнительную информацию можно найти в этом вопросе Stackru. Учитывая эту информацию, это должно работать для вас.
try {
return true;
} catch (Exception e) {
// do something here to deal with anything
// that somehow goes wrong just returning true
} finally {
xmlRpcClient.invoke("newDevices", listDeviceDesc);
}
IMO, делая что-то "после вызова return", но до обработки вызывающего метода возвращаемое значение неотличимо от выполнения этого до возврата, поэтому вам следует спросить себя, когда именно вы хотите, чтобы это произошло.
В приложении Swing GUI вы можете использовать SwingUtilities.invokeLater
отложить выполнение работоспособного до тех пор, пока "все остальное" не будет сделано. Это иногда полезно, когда одно действие пользователя приводит к выполнению большого количества слушателей (один компонент теряет фокус, другой компонент получает его, а другой компонент также активируется... все одним щелчком мыши).