我正在處理一個Android應用程序,它必須提出服務器請求,然後在請求完成時執行操作。下面是一些僞代碼,以幫助說明情況:確保回調的最佳方式始終是異步執行的?
makeRequest(new SomeTask{
onDone() {
// Do actionB with queue
}
});
// Do actionA with queue. Must be execute first!!
這裏是makeRequest
僞代碼的實現:如預期actionB
之前
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
發生,但在情況下,我們能夠避免網絡請求,SomeTask.execute
立即被調用。這導致actionB
出現之前actionA
,這是不好的。有什麼辦法可以保證這不會發生?
我已經多次在javascript中遇到過這種情況。在這些情況下,我會將SomeTask.execute
調用與setTimeout
或setImmediate
包裝在一起以維護正確的異步語義。
爲了清楚起見,這裏的相同錯誤的例子在JavaScript:https://gist.github.com/xavi-/5882483
任何想法,我應該在的Java/Android的呢?
爲什麼你不能makeRequest的調用之前採取行動答: 這是通過指定的AsyncTsak應該在一個線程池中運行固定的嗎? – 2013-06-27 19:31:33
這是一種可能性,但它需要大量的重構。此外,我希望有一個通用的解決方案,所以我不反對這個問題。 – Xavi
設置超時看起來像是一個非常hacky的解決方案 –