2011-09-20 76 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