android 设计注意事项:AsyncTask 与 Service(IntentService?)

2024-01-05

我正在设计一个 Android 应用程序,需要执行以下步骤:

  1. 用户按下按钮或以其他方式指示“同步数据”。
  2. 同步过程将使用 REST Web 服务将数据移入和移出服务器。
  3. 数据将存储在本地 SQLite 数据库中。
  4. 同步过程应向 UI 提供状态更新/消息
  5. 不应该允许用户在同步过程中走神到应用程序的其他部分并做更多的工作。

第一次运行同步过程可能需要 10-20 分钟。 初始同步后,将传输和存储更少的数据,并且 我预计该过程需要 1-2 分钟或更短的时间。

我已经阅读了很多有关 android 的文章AsyncTask以及使用服务的各种示例......但我不完全理解选择一种设计而不是另一种设计的设计考虑因素和权衡。我目前使用 AsyncTask 删除了我的演示项目。观看(大部分)开发 Android REST 客户端应用程序后:http://code.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html# http://code.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html#我很困惑这里描述的设计模式感觉太过分了 复杂,也许是因为我只是“不明白”。

我有 java、spring、web 和桌面应用程序背景。对于我来说,从手持设备角度思考和设计是相当新鲜的。 (更改屏幕布局时会发生什么?当我运行同步时手机铃声响起时会发生什么?)退后 2 步,如果初始同步将是一个如此长时间运行的过程,是否有更好的方法我思考问题->解决方案、用户体验、用户对手机上运行的应用程序的期望?

我很想听听一些经验丰富的 Android 开发人员的意见,他们已经解决了这些问题。


在我看来,这是主流/平均 Android 开发中最棘手/最困难的部分。例如,在黑莓手机上,这要容易得多。

绝对你需要使用Service.

AsyncTask不适合,因为它紧紧地“束缚”在你的身上Activity via a Context句柄(否则你将无法更新 UIActivity从你的AsyncTask)。然而Activity一旦Activity进入后台。进入后台的一个示例原因可能是来电 - 用户切换到电话应用程序,以便您的Activity变得不可见。在这种情况下(取决于当前的 RAM 状态)操作系统可能决定终止后台活动之一(对用户不可见)。

一些开发人员通过安排静态的东西来解决这个问题,以便在其中进行长时间运行的操作。有些建议使用Application实例。这是因为静态的东西和Application当整个应用程序进程存在时就存在。然而,这些都是不正确的解决方法。当操作系统决定需要终止时,Android 中的进程也可能被终止。 Android 操作系统对于它可以杀死什么以及以什么顺序杀死有自己的考虑。所有进程均分为 5 个“可杀灭性”级别。这是文档 http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle其中指定了这些级别。读到这里很有趣:

因为运行服务的进程是 排名比有背景的人高 活动,发起的活动 长时间运行的操作可能效果很好 启动该操作的服务, 而不是简单地生成一个线程 - 特别是如果操作将 可能比活动更持久。例子 其中正在播放音乐 背景并上传图片 由相机拍摄到网站。使用服务可以保证 操作将至少有“服务 进程”优先级,无论什么 发生在活动中。

Your Activity用户发起长时间运行的操作时应显示ProgressDialog确保用户在操作运行时不会执行任何其他操作。指南是here http://developer.android.com/guide/topics/ui/dialogs.html#ProgressDialog.

另外,您很可能想使用NotificationManager用于通知用户您长时间运行的操作完成(或失败),如果您的Activity目前是不可见的。这里是通知管理器信息 http://developer.android.com/guide/topics/ui/notifiers/notifications.html从开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 设计注意事项:AsyncTask 与 Service(IntentService?) 的相关文章

随机推荐

  • 想要将 dataset.info() 结果存储到 Python 中的数据框中

    我在 Python 中创建了一个数据帧 并使用 info 函数查看其元数据 但无法将 info 结果存储到数据框中 有什么办法可以做到这一点 df2 pd DataFrame A pd Series range 1 4 B pd Times
  • ASP.NET MVC 模型在同一页面上绑定相关实体

    这个问题已经让我发疯了几个小时了 在我的域中 我有 2 个彼此相关的实体Sku and Item 每个 sku 可以有很多商品 public class Sku private readonly EntitySet
  • React-native - Firebase onAuthStateChanged 无法正常工作

    我无法在我的反应本机应用程序中保留 Firebase 会话 这个问题几乎与React Native Firebase 身份验证持久性不起作用 https stackoverflow com questions 46143273 react
  • Node.js 版本号如何工作以及如何确保兼容性? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 项目的版本
  • 环绕文本的边界框

    我想在 QML 周围画一个矩形Text使用自动换行的对象 TextMetrics http doc qt io qt 5 qml qtquick textmetrics html看起来这很理想 但它似乎不支持换行文本 我如何测量文本在文本中
  • opengl 和 GLSL 有什么区别?

    我最近开始使用 openGL 进行编程 我已经完成了创建基本基元的代码 并在 webGL 中使用了着色器 我已经在谷歌上广泛搜索了这个主题 但对我来说仍然不太清楚 基本上 这就是我想知道的 是否有任何事情可以在 GLSL 中完成而在普通 o
  • 一个浮点数可以在给定范围内表示多少个值?

    直觉告诉我 由于 32 位可以表示固定数量的不同值 因此浮点可以表示任何给定范围的固定数量的值 这是真的 转换处理方式能够表示的值的数量是否有任何损失 Say I pick a number in the range 1030 1035 O
  • 类型“AngularFireAuth”上不存在属性“auth”

    使用 AngularFire 时出现此错误 检查了我的进口 它们似乎是正确的 我尝试重新安装 AngularFire 但它仍然抛出此错误 角火有问题吗 import Injectable NgZone from angular core i
  • C++ 编译时检查是否可以使用某种类型的参数调用重载函数

    考虑一个重载函数 void f int void f long void f double void f MyClass 以及模板类中参数类型未知的方法 template
  • 如何防止 IE 缓存导致重复的 Ajax 请求?

    我们使用Dynamic Sc ript Tag配合JsonP机制来实现跨域Ajax调用 前端小部件非常简单 它只是调用搜索 Web 服务 传递用户提供的搜索条件并接收和动态呈现结果 Note 对于那些不熟悉使用 JsonP 方法的动态脚本标
  • 从 Android 应用程序发送 POST 请求到 Django 视图

    我正在尝试从 Android 设备读取 QRCode 并将提取的 ID 发送到使用 Django 构建的 Web 服务器 我按照教程进行操作here http hmkcode com android send json data to se
  • css中的字符串连接

    我想在css中实现以下目标 我如何以跨浏览器的方式做到这一点 url img icons attr type 10 png 我认为你不能 在里面content属性你可以通过用空格分隔来 连接 但在其他地方我认为没有这样的功能 这是一种耻辱
  • 无法将文件移动到已安装的网络共享文件夹

    我正在尝试将文件上传到办公网络共享文件夹 我有权让我的用户帐户访问共享文件夹 我使用 UNC 路径直接通过 move upload file 函数上传文件 但它不起作用 我收到此错误 警告 move uploaded file 17 105
  • 从多列中选择值到单列中

    我在数据库中有一个表 其中有 9 列 其中包含相同类型的数据 这些值是允许为空 我需要将每个非空值选择到一列值中 这些值不关心它们源自的行的标识 因此 对于看起来像这样的表 Id I1 I2 I3 1 x1 x2 x7 2 x3 null
  • AFNetworking 2 - 获取错误 json 正文 [重复]

    这个问题在这里已经有答案了 我用的是最新的AF网络对于我的应用程序 它与 REST API 服务器通信 当我得到一些500JSON 主体出现错误 如下所示 message my error message 我无法从以下位置检索此消息NSEr
  • 将导航抽屉添加到现有活动

    我正在编写一个应用程序 它已经包含很多代码 我决定要向主活动工具栏添加一个导航抽屉 但我不知道如何在不创建新的导航抽屉项目和复制的情况下做到这一点我的整个项目看起来工作量很大 是否有教程可以向现有项目添加导航抽屉 创建布局布局左菜单 xml
  • 将 Json 反序列化为 C# bool

    我需要帮助解决一个非常简单的问题 如何在不创建包装根对象的情况下将下面的 json 反序列化为 C bool 谢谢 f valid false 0 如果您正在使用Json Net http james newtonking com json
  • 我们如何才能使 __future__ 进口全球化?

    规格 Python 2 7 我正在开发一个具有多个模块的项目 我想激活所有模块中 future 模块的一些功能 我想在一个模块上导入我需要的所有功能 然后将该单个模块导入到每个其他模块 并使这些功能在所有模块中处于活动状态 或者达到这种效果
  • 为什么 W3C 建议将输入元素包装在

    标记中?

    我在网上看到了很多示例 其中表单的布局如下
  • android 设计注意事项:AsyncTask 与 Service(IntentService?)

    我正在设计一个 Android 应用程序 需要执行以下步骤 用户按下按钮或以其他方式指示 同步数据 同步过程将使用 REST Web 服务将数据移入和移出服务器 数据将存储在本地 SQLite 数据库中 同步过程应向 UI 提供状态更新 消