2011-09-20 96 views
6

什麼設計模式服務將是智能在以下組件(簡體)存在:設計模式對於像建築

3組件
- GUI
- 數據提取程序
- 數據庫

Design

我無法訪問互聯網上的服務器,它只是一個數據源。放置在互聯網中的數據總是比較新的,本地數據庫只是互聯網中的一個拷貝(緩存)。 GUI可以請求和更新本地緩存,類服務組件然後異步獲取最新數據,這可能需要一段時間。 GUI僅顯示來自本地數據庫的數據,它可以同步獲取。

所以我的問題是,你會用什麼類的長期運行服務與Progressbar功能?這種「問題」有沒有更好的設計?有更好的做法嗎?

回答

1

在服務狀部件:

  • 的接口(方法)開球更新過程。通常,此服務將返回jobId以指示正在後臺處理的作業。
  • 另一個基於特定jobId獲取狀態的接口(方法)。該服務的實現可以返回狀態,percentCompleted或任何其他相關信息,這些信息會告訴調用者更新過程的當前狀態。此方法的實現需要能夠報告增量進度(例如報告本地存儲中的增量存儲),以便製作精確的進度條,否則最好的UI可以顯示旋轉進度條。
    • 請注意,如果這樣的增量報告不可能實現,那麼更新過程應該使用典型的AsyncTask用法,該用法在後臺執行更新並在完成後向用戶報告。如果此操作可能需要一段時間,則可以通過Android通知欄或推送通知來實現更新。

假設你有接口,以獲得更新的進度,你可以利用AsyncTask onProgressUpdate上報更新的進度。該方法是專門爲此設計的。

你的步驟大致如下:

  • 執行接口,通過一個更新的AsyncTask。由於您的更新是異步發生的,因此此特定任務應該可以很快返回,狀態報告執行是否成功運行或失敗,因爲某些異常及其當前正在執行的jobId
  • 啓動另一個AsyncTask來檢測更新並通過onProgressUpdate報告進度。在大致的AsyncTask看上去像

public class GetUpdateStatusAsyncTask extends AsyncTask { 
    protected Integer doInBackground(Integer... param) { 
     // this is the jobId that you get from the previous AsyncTask that you use to kick off the 
     // the update process 
     int jobId = param[0]; 
     double percentCompleted = fetchStatus(jobId); 

     while(percentCompleted != 100.00) { 
      publishProgress(percentCompleted); 
     } 

     // return status code 
     return 1; 
    } 

    protected void onProgressUpdate(Double... progress) { 
     // set the progressBar here 
    } 

    protected void onPostExecute(Long result) { 
     // done, handle status code 
    } 

    private double fetchStatus(int jobId) { 
     double percentCompleted = 0.0; 
     // call interface to get the update based on the jobId 
     // return percentCompleted status or make a more complex object if you need 
     // more detail info 
     return percentCompleted; 
    } 
} 
+0

也許我要澄清我的第一篇以上。我沒有訪問互聯網上的服務器。它只是一個數據源,最新的一個。我抓住數據並更新本地數據庫。 – kadir

+0

如果Service Like Component是一個本地類,爲了準確地報告進度,仍然需要接口能夠獲得此類中的當前進度。如果沒有該界面的可用性,您可以做的最好的方法是顯示旋轉進度欄並等待更新完成。我會更新答案 – momo

+0

看起來不錯,但爲什麼你想啓動另一個asynctask輪詢第一個的進展? – kadir