【问题标题】:Design-Pattern for a Service like Architecture类似架构的服务的设计模式
【发布时间】:2011-09-20 17:59:20
【问题描述】:

以下组件(简化)存在的设计模式将是智能的:

3 个组件
- 图形用户界面
- 数据获取器
- 数据库

我无法访问 Internet 中的服务器,它只是一个数据源。存放在 Internet 中的数据总是较新的,本地数据库只是 Internet 中的数据的副本(缓存)。 GUI 可以请求和更新本地缓存,类服务组件然后异步获取最新数据,这可能需要一段时间。 GUI 仅显示本地数据库中的数据,他可以同步获取这些数据。

所以我的问题是,对于具有 Progressbar 功能的可能长期运行的服务,您会使用哪些类?这种“问题”有更好的设计吗?有更好的做法吗?

【问题讨论】:

    标签: android design-patterns


    【解决方案1】:

    关于服务类组件:

    • 启动更新过程的接口(方法)。通常,此服务会返回 jobId 以指示正在后台处理的作业
    • 根据特定jobId 获取状态的另一个接口(方法)。此服务的实现可以返回状态、已完成百分比或任何其他相关信息,这些信息将告诉调用者更新过程的当前状态。此方法的实现需要能够报告增量进度(例如报告本地存储中的增量存储)以制作准确的进度条,否则 UI 可以做的最好的就是显示旋转进度条。
      • 请注意,如果无法实现此类增量报告,则更新过程可能应使用典型的AsyncTask 用法,在后台执行更新并在完成后向用户报告。如果此操作可能需要一段时间,您可以通过 Android 通知栏或推送通知来实现更新完成。

    假设您有获取更新进度的界面,您可以使用AsyncTask onProgressUpdate 报告更新进度。该方法是专门为此设计的。

    你的步骤大致如下:

    • 通过一个 AsyncTask 执行接口进行更新。由于您的更新是异步进行的,因此该特定任务应该会很快返回并报告执行是否成功运行的状态,因为当前正在执行的 jobId 出现了一些异常
    • 启动另一个正在 ping 更新状态的 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;
        }
    }
    

    【讨论】:

    • 也许我应该进一步澄清我的第一篇文章。我无法访问 Internet 中的服务器。它只是一个数据源,最新的。我抓取数据并更新本地数据库。
    • 如果Service Like Component是本地类,为了准确上报进度,还需要接口能够在该类内获取当前进度。如果没有该界面的可用性,您可以做的最好的事情是显示旋转进度条并等待更新完成。我会更新答案
    • 看起来不错,但是为什么要启动另一个异步任务来轮询第一个的进度?
    • 如果您希望按照您的描述从互联网异步数据更新并获得进度,您需要运行两个线程(一个通过互联网获取更新,另一个是轮询进步)。否则,获取数据的将阻塞进度轮询。如果可以进行增量进度报告,那么所描述的第一个 AsyncTask 可能应该从 ServiceLikeComponent 中启动,并且它不需要显示为 AsyncTask(或者您可以将其编码为线程中的 Runnable)。
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2018-04-28
    • 2012-12-11
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多