Как отложить кусок кода до окончания обратного звонка?

В методе мне нужно вызвать некоторый код, но после вызова метода. Как мне это сделать?

// 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 отложить выполнение работоспособного до тех пор, пока "все остальное" не будет сделано. Это иногда полезно, когда одно действие пользователя приводит к выполнению большого количества слушателей (один компонент теряет фокус, другой компонент получает его, а другой компонент также активируется... все одним щелчком мыши).

Другие вопросы по тегам