Я работаю с Android-приложением, которое должно выполнить запрос сервера, а затем выполнить действия, когда запрос будет завершен. Вот некоторые псевдо-код, чтобы объяснить ситуацию:Лучший способ гарантировать обратный вызов всегда выполняется асинхронно?
makeRequest(new SomeTask{
onDone() {
// Do actionB with queue
}
});
// Do actionA with queue. Must be execute first!!
Вот реализация makeRequest
в псевдокоде:
makeRequest(SomeTask task) {
if(canDoOptimization) { // if true, don't need to make request
// It's a bad idea to execute this immediately.
// Wish I could wait until the current thread of execution was done...
task.onDone();
return;
}
asyncTask = new AsyncTask<SomeTask, Void, Void>() {
doInBackground(SomeTask... task) {
// Make server request...
task.onDone();
}
}
asyncTask.execute(task);
}
Обычно actionA
происходит до actionB
, как и ожидалось, но в тех случаях, когда мы можем избежать сети запросы, SomeTask.execute
вызывается немедленно. Это приводит к возникновению actionB
доactionA
, что плохо. Есть ли способ гарантировать, что этого не произойдет?
Я столкнулся с этой ситуацией несколько раз в javascript. В таких случаях я бы обернул вызов SomeTask.execute
setTimeout
или setImmediate
, чтобы сохранить правильную асинхронную семантику.
Для ясности, вот пример того же ошибка в JavaScript: https://gist.github.com/xavi-/5882483
Любая идея, что я должен делать в Java/Android?
Почему вы не можете называть действие А до того makeRequest? –
Это возможность, но это потребует значительного рефакторинга. Кроме того, я надеялся, что существует общее решение, поэтому я бы не стал помнить об этой проблеме. – Xavi
Установка тайм-аута кажется очень храбрым решением для этого –