什么是 GoogleApiClient 设计模式?
What's the GoogleApiClient design pattern?
我一直在使用 Android 的 GoogleApiClient 访问其他 APIs,例如地理围栏。我感谢 GoogleApiClient 和 Google Play 服务,Google 一直在尝试解决 Google 碎片问题,方法是允许较旧的 Android 设备连续下载更新包含在其中的 APIs,无需更新全新的操作系统。
我在 Java 级别不清楚的是为什么 GoogleApiClient 需要并支持 connect/suspend/fail 的回调?没有进一步的细节,似乎 GoogleApiClient 本质上是其他 APIs 的包装器是过度烘烤和过度设计的。 connecting/suspending/etc 不能对开发人员透明吗?最坏的情况是无法访问服务,难道它不会抛出异常吗?
因此,与其批评,我确实认为我的知识存在漏洞,这意味着我无法欣赏设计。为什么 Google 以这种方式设计 API 客户端?是否有他们遵循的设计模式?
它的结构有很多原因,但最重要的是:
- GoogleApiClient 代码的设计使您可以从 Android UI 主线程调用它(无需显式创建 AsyncTask 或后台线程)
- GoogleApiClient 代码可能需要很长时间才能运行(例如,如果用户没有安装 Play 服务,它会提示用户下载/安装 Play 服务,并且只有 return 控件安装 Play 服务后返回应用程序)
- 如果主线程被长时间 运行ning 操作(例如从 Play 商店下载应用程序)阻塞,Android UI 将变得无响应。因此,注册回调对于 Android 领域的此类代码来说是非常标准的。 [长时间阻塞AndroidUI主线程是系统强制退出应用程序的常见原因]
现在,最重要的是,增加 Play 服务复杂性的众多因素之一是对灵活性的需求,需要支持许多不同的功能/库,而不需要每个使用 Play 服务的应用程序都需要编译/包含它支持的每个库(并且,与此相关的是,通过在每个利用 Play 服务的应用程序中复制 Play 服务的所有功能来避免膨胀每个应用程序)。因此,Play Services 使用客户端-服务器架构;使用 Play 服务的应用不会导入所有 Play 服务(包括提供该系统底层功能的代码)。相反,每个使用 Play Services 的应用程序都会导入一组更小、更集中的接口,这些接口能够与 Play Services 应用程序中这些服务的实现进行通信(并且只有 Play Services 应用程序本身需要包含所有的实际实现这些接口的逻辑)。但是,由于这种架构,您需要执行 "import" 的等效操作,但在 运行 时间...也就是说,您可能需要在使用其功能之前下载并初始化 Play Services 应用程序。
我一直在使用 Android 的 GoogleApiClient 访问其他 APIs,例如地理围栏。我感谢 GoogleApiClient 和 Google Play 服务,Google 一直在尝试解决 Google 碎片问题,方法是允许较旧的 Android 设备连续下载更新包含在其中的 APIs,无需更新全新的操作系统。
我在 Java 级别不清楚的是为什么 GoogleApiClient 需要并支持 connect/suspend/fail 的回调?没有进一步的细节,似乎 GoogleApiClient 本质上是其他 APIs 的包装器是过度烘烤和过度设计的。 connecting/suspending/etc 不能对开发人员透明吗?最坏的情况是无法访问服务,难道它不会抛出异常吗?
因此,与其批评,我确实认为我的知识存在漏洞,这意味着我无法欣赏设计。为什么 Google 以这种方式设计 API 客户端?是否有他们遵循的设计模式?
它的结构有很多原因,但最重要的是:
- GoogleApiClient 代码的设计使您可以从 Android UI 主线程调用它(无需显式创建 AsyncTask 或后台线程)
- GoogleApiClient 代码可能需要很长时间才能运行(例如,如果用户没有安装 Play 服务,它会提示用户下载/安装 Play 服务,并且只有 return 控件安装 Play 服务后返回应用程序)
- 如果主线程被长时间 运行ning 操作(例如从 Play 商店下载应用程序)阻塞,Android UI 将变得无响应。因此,注册回调对于 Android 领域的此类代码来说是非常标准的。 [长时间阻塞AndroidUI主线程是系统强制退出应用程序的常见原因]
现在,最重要的是,增加 Play 服务复杂性的众多因素之一是对灵活性的需求,需要支持许多不同的功能/库,而不需要每个使用 Play 服务的应用程序都需要编译/包含它支持的每个库(并且,与此相关的是,通过在每个利用 Play 服务的应用程序中复制 Play 服务的所有功能来避免膨胀每个应用程序)。因此,Play Services 使用客户端-服务器架构;使用 Play 服务的应用不会导入所有 Play 服务(包括提供该系统底层功能的代码)。相反,每个使用 Play Services 的应用程序都会导入一组更小、更集中的接口,这些接口能够与 Play Services 应用程序中这些服务的实现进行通信(并且只有 Play Services 应用程序本身需要包含所有的实际实现这些接口的逻辑)。但是,由于这种架构,您需要执行 "import" 的等效操作,但在 运行 时间...也就是说,您可能需要在使用其功能之前下载并初始化 Play Services 应用程序。