【发布时间】:2013-06-27 19:24:58
【问题描述】:
我正在使用一个 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 中多次遇到这种情况。在这些情况下,我会用setTimeout 或setImmediate 包装SomeTask.execute 调用以保持正确的异步语义。
为了清楚起见,下面是 JavaScript 中相同错误的示例:https://gist.github.com/xavi-/5882483
知道我应该在 Java/Android 中做什么吗?
【问题讨论】:
-
为什么不能在makeRequest之前调用action A?
-
这是一种可能性,但需要大量重构。另外,我希望有一个通用的解决方案,所以我无论如何都不必注意这个问题。
-
设置超时似乎是一个非常hacky的解决方案
-
对,在 Java 中可能是这样。但在 JS 中,我觉得这是
setTimeout的标准用例。这很常见,以至于 Node.js 提供了一个更优化的版本,称为process.nextTick。
标签: java android concurrency