2012-12-05 53 views
2

你好,這是一個很簡單的問題,而是一個複雜的答案我懷疑:安卓:隊列後,直到有一個連接

這就是所謂的「礦井的情況」

讓我解釋一下:想象一個簡單的場景在那裏你不得不做一個應用程序,即使在沒有信號的礦井下也可以掛載到網頁上。

ie如何在沒有連接的情況下嘗試/排隊提交事件(HTTPPOST),然後定期輪詢隊列(測試連接是否存在),直到事件觸發。

PS:警告:請這是關於「如何」至於這個「不正當」,再沒有一個對話:同步或2級的用戶等等等等,重複記錄或重寫數據

僞代碼:

try{ 
    MyHttpFileUploader myupload = new MyHttpFileUploader(); 
    myupload.Start(); 
} 
catch (InternetDownException ex){ //<-- how do I "throw" this in the start method gracefully? 
    GlobalQueue.Add(myupload); //<-- how do i set a timer properly that can action this queue (.Start() method) and post messages "when complete" to toast on the main ui thread but otherwise not block the ui whatsoever 
} 
+0

愚蠢的問題一些代碼樣本被觸發,但你聽說過明顯的線程(? )。在產生一個線程來處理這個問題時有什麼問題(如果應用程序可能會在完成之前關閉,那麼你應該存儲狀態,並在應用程序根據存儲狀態啓動恢復)。另外 - 「我該如何」在優雅的啓動方法中拋出「這個意思是什麼意思?」......你已經抓住了它......所以要麼處理異常(通過啓動線程),要麼重新拋出它以後被捕獲) –

+0

http post已經是一個異步事件。這不是UI拆分。這是很好的帖子投票在論壇的例子中很少失蹤。如果沒有互聯網連接,線程化或不線程化會失敗,這需要不會失敗,但在「x」時間量後重試並重復沖洗直至成功。工作流程正是電子郵件用於發件箱的工作流程。文本用於發送。沖洗重複,直到服務器正常。我不介意在應用程序在UI線程中處於活動狀態時是否僅清洗/重複,或者它是否在後臺進行永久輪詢,無論用戶是否交互。 – conners

+0

在這方面,一旦他們發起帖子,它與保存的實例狀態或用戶應用程序交互沒有任何關係。 – conners

回答

2

這是一個粗略的(因爲我現在主要是在C#代碼和它不會是有關的問題)半僞代碼的主要觀點Sun文檔片段(線程)

創建能夠訪問需要在您的異步方法後任何變量的類繼承Thread即

class WorkerThread extends Thread { 
    int someDataYouNeed; 
    MyHttpFileUploader maybeAClassYouNeedToCommunicateWithAtEnd; 
    boolean hasNotFinishedTask = true; 
    WorkerThread(int someDataYouNeed, MyHttpFileUploader callBackClass) { 
     this.someDataYouNeed = someDataYouNeed; 
     this.maybeAClassYouNeedToCommunicateWithAtEnd = callBackClass; 
    } 

    public void run() { 

     while(hasNotFinishedTask){ 
     //do your work in here 
     //Try contact network endpoint 
     try{ 
      //do a network call and if it doesnt except 
      hasNotFinishedWork = false 
      //now callback to the class firing a method maybe (I just made one up) 
      maybeAClassYouNeedToCommunicateWithAtEnd.Close(); 
     }catch(TheException ex){ //do nothing or log } 
     if(hasNotFinishedTask){ 
       Thread.Sleep(60000);//retry every minute 
      } 
     } 
    } 
} 

//當你的非同步任務失敗實例的線程....

WorkerThread worker = new WorkerThread(42, this); 
worker.start(); 

現在我說 - 我假設你的應用程序正在智能手機上運行,​​可以關閉...如果是這樣的話,只要操作系統允許它可以保存狀態(當你創建WorkerThread時),例如xml文件系統和WorkerThread實例檢查文件是否存在,並從關閉時的起始位置開始。

在a點)雖然我的例子是一個郵件服務器,它們都是網絡端點可能不可用

UPDATE:

現在,我認爲這將是直的Java(記住我C#所以不經常在平臺上),但它看起來好像有很容易的例子,在較新版本的Java或Android的此東西的異步通用類型...

請參閱this blog post for android specific multi-threading或doa谷歌搜索Android多 - 針對特定平臺的示例的線程化

+0

並且在'必須是隊列'註釋中...在WorkerThread運行方法中,您可以通過列表'東西'(也許你可以提供一個名爲的WorkerThread構造函數,也許是一個xml文件中的東西列表......),當線程完成它們時 - 退出。 –

+0

我會給你的要點 - 對於簡單的睡眠while循環作爲一個計時器,很好很容易 - 但我會回來並鏈接我最終做的 – conners

+0

我很想看看你想出了什麼樣的策略: ) –

0

一種方法是使用IntentServiceAlarmManager觸發嘗試發送數據。

這裏有一個關於使用意圖here和意圖的更多信息可以由AlarmManager

也有在此線程AlarmManager not working

+0

感謝Rod,我真誠地認爲這需要一個教程 - 一個用於「獲取和緩存http」json/images/content以及一個用於排隊json的隊列......以「礦井」方式正確完成,即使應用程序工作,只是警告連接關閉..我正在努力這個..一個適當的教程,如何使連接獨立的http事件..考慮到java是一種「錯誤管理」的語言,它是令人震驚的權力,這是唐'對於最終用戶程序員來說這是一場戰鬥 – conners

+0

同意,我正在尋找類似的東西。 –