Android 类服务体系结构的设计模式

Android 类服务体系结构的设计模式,android,design-patterns,Android,Design Patterns,存在以下组件(简化)的智能设计模式是什么: 3个组件 -图形用户界面 -数据获取程序 -数据库 我无法访问Internet上的服务器,它只是一个数据源。互联网上的数据总是更新的,本地数据库只是互联网上数据的副本(缓存)。GUI可以请求和更新本地缓存,类似服务的组件异步获取最新数据,这可能需要一段时间。 GUI只显示本地数据库中的数据,他可以同步获取这些数据 所以我的问题是,对于具有Progressbar功能的可能长期运行的服务,您会使用哪些类?对于这种“问题”,有更好的设计吗?是否有更好的做法

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

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

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


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

关于类似服务的组件:

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

您的步骤大致如下:

  • 通过一个异步任务执行要更新的接口。由于您的更新是异步进行的,因此此特定任务应以相当快的速度返回,并报告执行是成功运行还是失败,因为它当前正在执行的jobId中存在一些异常
  • 启动另一个正在ping更新状态的异步任务,并通过
    onProgressUpdate
    报告进度。异步任务大致如下所示

也许我应该进一步澄清我的第一篇文章。我无法访问Internet上的服务器。它只是一个最新的数据源。我获取数据并更新本地数据库。如果类似服务的组件是本地类,为了准确地报告进度,仍然需要interface能够获取该类中的当前进度。如果没有该界面,最好显示旋转进度条并等待更新完成。我将更新应答器看起来不错,但为什么要启动另一个asynctask来轮询第一个应答器的进度?如果您希望按照所述从internet asynchronous中的数据进行更新并获得进度,则需要运行两个线程(一个线程通过internet获取更新,另一个线程轮询进度)。否则,获取数据的人将阻止进度轮询。如果可以进行增量进度报告,那么所描述的第一个异步任务可能应该从ServiceLikeComponent中启动,而不需要将其显示为异步任务(或者可以将其编码为线程中可运行)。

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;
    }
}