서버 요청을 한 다음 요청이 완료되면 작업을 수행해야하는 Android 앱을 사용 중입니다. 여기콜백을 보장하는 가장 좋은 방법은 항상 비동기 적으로 실행됩니까?
makeRequest(new SomeTask{
onDone() {
// Do actionB with queue
}
});
// Do actionA with queue. Must be execute first!!
의사 코드에 makeRequest
의 구현 것 : 여기에 상황을 설명하는 데 도움이되는 몇 가지 의사 코드는 예상대로 보통 actionA
는 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);
}
,하지만 경우에 우리는 네트워크를 피할 수있는 곳 요청시 SomeTask.execute
이 즉시 호출됩니다. 이로 인해 actionB
이 앞에 나타나고actionA
이 나옵니다. 이 일이 발생하지 않는다고 보장 할 수있는 방법이 있습니까?
저는이 상황을 여러 번 자바 스크립트에서 실행했습니다. 이러한 경우 SomeTask.execute
전화를 setTimeout
또는 setImmediate
으로 포장하여 올바른 비동기 의미를 유지합니다. 명확성을 위해
, 여기에 자바 스크립트에서 동일한 버그의 예 : 나는 자바/안드로이드에서 무엇을해야 https://gist.github.com/xavi-/5882483
어떤 생각?
왜하여 makeRequest 전에 액션 A를 호출 할 수 없습니다 : 이것은 AsyncTsak이 스레드 풀에서 실행되도록 지정하여 고정? –
그럴 수도 있지만 상당한 리팩토링이 필요합니다. 또한 일반적인 해결책이 있기를 바랬으므로 어쨌든이 문제를 염두에 두지 않아야합니다. – Xavi
시간 제한을 설정하는 것은 매우 해킹 된 솔루션처럼 보입니다. –