【问题标题】:Android Service for uploading data for x minute in every x minute用于每 x 分钟上传 x 分钟数据的 Android 服务
【发布时间】:2014-07-13 13:36:23
【问题描述】:

我有 2 个服务在后台运行。一个将不断收集位置数据,另一个将数据发送到服务器,AlarmManager 每 10 分钟启动一次。

在向服务器发送数据的服务中,我有一个方法可以在onStartCommand() 中发布数据(来自数据库的 50 行)。我想让服务连续执行发布数据方法长达 5 分钟。

我尝试使用 while 循环连续执行该方法,但它会显示应用程序没有响应的消息。我认为 while 循环正在主线程中不间断地执行服务中的方法,导致活动崩溃。

有没有更好的方法来在服务中连续执行一个方法,同时在主线程上崩溃活动?

【问题讨论】:

  • 这是电池寿命的死亡愿望

标签: android loops service


【解决方案1】:

您需要在另一个线程上完成您的工作。

该服务帮助控制 UI 之外的生命周期,但它仍然在 MainThread 上。

它被称为“后台服务”,因为它的后台生命周期与您的 Activity 生命周期不同。

最简单的例子是从您的背景Service 中生成一个ASyncTask,或者最好使用IntentServiceIntentService 将自动控制您对线程的使用。

这里是 Intent Service 线程工作的官方文档:

http://developer.android.com/training/run-background-service/send-request.html

这里是我讨论的 API 文档 http://developer.android.com/reference/android/os/AsyncTask.html http://developer.android.com/reference/android/app/IntentService.html

【讨论】:

    【解决方案2】:

    我有 2 个服务在后台运行。一个将不断收集位置数据,另一个将数据发送到服务器,AlarmManager 每 10 分钟启动一次。

    这对电池寿命来说很糟糕,因为您需要通过WakeLock 保持 CPU 不断通电以“不断收集位置数据”。

    在向服务器发送数据的服务中,我有一个方法可以在 onStartCommand() 中发布数据(来自数据库的 50 行)。我想让服务连续执行发布数据方法长达 5 分钟。

    这对电池寿命来说会更糟,因为现在您需要让 WiFi 或移动无线电设备持续处于高功率状态长达 5 分钟。

    有没有更好的方法来在服务中连续执行一个方法,同时在主线程上崩溃活动?

    fork 一个后台线程。

    【讨论】:

    • 感谢您的回答。您说过连续收集数据和发送数据长达 5 分钟会很耗电,如何更改应用程序以提高电池寿命?
    • @user2763829:嗯,你最大的限制因素是为你的位置收集保持 CPU 开启。除非您要更改该特定要求,否则电池寿命将很糟糕。除此之外,当有足够的数据值得发送时,让您的 first 服务派生一个线程来执行发送数据所需的磁盘和网络 I/O。特别是,在短脉冲中执行您的网络 I/O,这些脉冲之间的时间尽可能长。然后每 10 分钟一次的 AlarmManager 和第二次服务可以消失。
    • @user2763829:无论如何,您都需要一个用于磁盘和网络 I/O 的后台线程——如果您尝试在主应用程序线程上执行此操作,网络 I/O 将在 Android 4.0+ 设备上彻底崩溃。我建议阅读the training guide on battery-efficient data transfers 以了解有关数据上传的更多提示。
    • 该应用程序将用于活动识别,因此需要持续记录数据。我现在要做的是每10分钟启动一项服务并检查设备是否连接到wifi,如果连接到wifi,则仅使用http post通过asynctask连续发送50行数据长达5分钟,否则停止服务.我会阅读提供的链接!谢谢!
    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多