【问题标题】:Design for downloading files before starting of an Activity活动开始前下载文件的设计
【发布时间】:2017-01-11 07:21:15
【问题描述】:

我有一个用例,我想从服务器下载一些文件并将它们存储在本地,然后再开始另一个依赖于该文件的活动。这种设计可以在卡拉OK类的应用程序中找到,点击一首歌曲会

  1. 从服务器加载所需文件
  2. 下载完成后,打开所需的活动。

让我们假设我的应用是一个卡拉 OK 应用。我的问题是如何设计这个流程。基本上,单击一首歌曲时,我想在屏幕上显示进度,下载完成后,我想转到活动。另一个要求是,一旦我进入卡拉 OK 活动屏幕并播放一首歌曲,我就有一个选项会导致加载另一节课。如果用户使用该选项,我想再次下载所需的文件。基于这个要求,我应该:

  • 是否将文件加载作为单独的活动? 或
  • 在我选择特定歌曲的活动中,它可以用作Fragment。在这种情况下,一旦进入卡拉OK屏幕,如果我选择一个导致下载一些文件并重新加载此活动的选项,这是最好的设计吗?

【问题讨论】:

    标签: android android-fragments android-activity design-patterns


    【解决方案1】:

    我会推荐两种不同的方法,具体取决于您计划保留已下载数据的时间。如果它是单次使用,那么绑定服务将是理想的。但是,如果您打算将下载的内容保留不止一次使用,我建议您使用内容提供程序和可能的同步适配器(取决于内容下载的频率/可预测性)。这个组合将帮助您不必过多考虑“设计”(因为此时它非常标准),而且它会提供许多您可能/可能不觉得有用的功能:您可以使您的内部数据通过内容提供者/授权“公开”,您可以在与您的应用关联的手机上创建一个“帐户”,以便用户可以通过同步管理器管理其同步(实际上是通过使用同步的小部件/应用经理,但仍然),最重要的是一组干净(ish)/标准的方法来与之交互/传播 UI 等。

    我的简单版本是一个 Activity,它产生一个带有回调的异步 AIDL 服务(我认为这是使用绑定服务的唯一方法),它允许您异步设计您的“启动器”活动,它的“当前正在下载”微调器(如果您以这种方式设计,它可以通过回调获取进度更新)。然后,一旦下载完成,然后将结果(通过 Intent 包中的包文件描述符)发送到使用它的新活动。

    但是,如果您打算多次使用数据,我建议您像上面那样下载内容,然后将其存储在内容提供程序中以便以后访问。提供者还有很多与游标加载器等相关的很好的相关功能,这将有助于保持当前存储的内容列表很好并且干净/最新/动态/等。但是,设置一次需要做更多的工作,以后会减少您的时间。

    当要下载的数据是可预测的时,最好使用同步适配器,无论是基于用户的帐户还是临时性的(例如某人有一个帐户可以从(电子邮件帐户等)下载数据),或者当目标相当稳定时,但数据应该每隔一小时左右更新一次(例如当前天气)。因此,这在很大程度上取决于您的应用程序的具体细节。

    这是我写的 Android 应用程序开发课程的作业,它是第一个选项的更简化版本(它具有意图服务 + 广播接收器,用于将下载结果返回给 Activity)。显然,由于这是一个作业,它有一些部分被剪掉来制作骨架代码,但是文档非常详细,应该很容易实现。

    https://gitlab.com/vandy-aad-3/aad-3-assg-2/tree/master

    这是针对同一课程的该作业的扩展,重点是实现简单的内容提供者的 4 种主要方法(创建、读取、更新和删除)。有关提供者的所有其他信息都将提供给您。

    https://gitlab.com/vandy-aad-3/aad-3-assg-3/tree/master

    显然,在两个应用程序中下载的内容可能不是您想要的,但这是一个简单的交换,可以替换为您想要的内容。

    不要太卖力,但这是本课程所包含的(免费)专业化:https://www.coursera.org/learn/androidapps

    【讨论】:

      【解决方案2】:
      • 第一点:不要下载Activity级别内的视频文件。您可以启动Service 来处理它。下载功能完成后,您可以启动第二个Activity。下载功能正在进行时,您可以显示ProgressBar
      • 第二点:最佳设计是向用户显示带有百分比的ProgressBar。或禁用该功能。下载完成后启用或开始第二个活动。

      【讨论】:

      • 是的。我得到了两个点。但是,我打算使用android.googlesource.com/platform/development/+/master/samples/… 中提到的设计模式并使用后台任务片段来下载文件。我的问题是我应该开始不同的活动来下载文件,还是应该在我点击打开特定歌曲的活动上显示为片段?
      • 你可以添加EventBus库,就是在Contexts之间发送一个Event。因此,下载完成后,请发送Event 到您的ActivityFragment。并通过事件监听器抓取对象并更新您的视图
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多