[英]How to perform multiple related calls to AsyncTasks without overlapping?
我有一個需要重復調用Web API的應用程序。 有效地,它遍歷SQL表中的記錄,並使用適當的數據對Web服務器進行唯一調用。 這是一種數據同步。
據我了解,對API執行此類HTTP請求時,它應在AsyncTask中進行以避免掛斷UI,因此我創建了AsyncTask類,該類發出請求並解析響應,但我需要傳遞將此數據返回給調用類。
最重要的是,我不希望調用類並行運行這些請求。 我希望它發出一個請求,而不是迭代表中的下一條記錄,並發出第二個請求,直到第一個請求完成。 因此,從某種意義上說,我希望這被阻止,但仍在單獨的線程中,以使UI不會凍結。 至少,我認為這是我想要的。
偽代碼與此類似:
// caller function
public void synchronize(){
load all records from sql table
for each record:
if record type is X:
new asyncX().execute(record)
// once this completes successfully,
// I want to do something with the return value here,
// before going on to the next iteration
//
// and eventually when there is some UI here,
// show some nice spinny logo and maybe some text for
// what's going on right now
if record type is Y:
new asyncY().execute(record)
// same as above
}
// Async class
public class asyncX extends AsyncTask<RecordType,Void,RecordType> {
protected RecordType doInBackground(RecordType... record) {
convert record to json
make http request
receive http response
parse response
return record
}
}
我正在考慮的方式是將syncize函數更改為一次僅運行一條記錄,調用async任務,然后結束,然后async任務回調到syncnize_followup()函數,該函數執行所需的操作使用返回值,然后再次開始同步備份,但是我不確定我是否喜歡這樣做。
關於如何進行的想法?
線程同步已經發明了您想要解決此問題的方法,因此您不必以自己的方式實現它。
有一個類似於Semaphore
的類,稱為CountDownLatch
。 當您聲明一個對象並通過.wait()
激活鎖定機制時,它將凍結其他代碼的執行,直到您發出.countDown()
語句為止。 確實,如果聲明CountDownLatch(1)
可能會產生您想要的效果。
在CountDownLatch的參考頁上,有一個不錯的示例,說明如何通過阻止一個Thread
的執行(取決於另一個Thread
的執行)來實現此目的。
為了滿足我的需求,我改為將synchronize
功能放入AsyncTask中,將其從我的UI線程中分離出來,並將傳出的HTTP請求保留為常規函數(因此它們被阻塞了)。
這意味着同步過程在后台發生,不會影響UI線程,並且每個傳出的API調用都按順序發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.