簡體   English   中英

如何在不重疊的情況下對AsyncTasks執行多個相關調用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM