如何在与用户界面线程分开的服务中使用Androids location包?

时间:2011-11-14 04:25:34

标签: java android multithreading location

我有一个小型的Android应用程序,我一直在努力将GPS数据记录到我的SD卡中的GPX文件中。我目前有一个主要的Activity,它启动一个Service来完成所有的后台工作。该服务保留在通知栏的前台,使其成为操作系统最不可能被杀死的东西。目前,我要求以最大频率从服务进行位置更新,以获得最准确的路线。我遇到的问题是我的用户界面表现得很慢/很奇怪。如果我错了,请纠正我,但我得出的结论是,我在应用程序的主线程中有太多的进展。我的下一个想法是尝试将执行获取和记录数据的服务移动到单独的线程。我是Java / Android的新手,所以与单独的线程交互的整个主题对我来说很难解决。最初在研究中我遇到了IntentServices,它本来可以使线程更容易,但从我读到的这些看起来似乎与Android位置包没有很好的混合,因为它们运行时间不够长。我觉得我在这个主题的互联网搜索圈子里跑。我迫切需要一些关于如何为我的程序服务实现以下功能的指导:

  1. 从主线程中分离线程
  2. 获取和存储数据必须是被操作系统杀死的最不可能的事情,并且一旦启动就无限期地运行(不要担心电池我将在运行应用程序时将设备插入电源)。
  3. 最终我需要能够与用户界面进行交互
  4. 感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:1)

这是我在

上取得了很多成就的常见问题

在启动器或main()(Android正在调用一个Activity)中你尽可能少地做(这相当于保存他们给你的refs,并且只要你在那里就可以设置一些其他的东西)和不要^进入长时间运行的活动

服务正是您所需要的,但不是试图将其泵入“保持它”状态,而是实现对空值的检查并根据需要进行处理 - 尝试“修复”机器来实现它以你想要的方式运行实际上涉及重新绑定你坚持主线程并让它尽可能快地与Applicaton的一般约束一致。

要做到这一点,您只需编写一个服务 - 读取所有可用内容 - 然后扩展该服务并实现Runnable,然后从Activity Constructor中运行该代码的构造函数并执行新的Thead(yourClass).start();在onCreate()中再次启动之前检查Thread.isRunning()...

服务将在其中的某个地方进行onCompletion()调用 - 它将通过一个接口

这一切都是在Android中完成的,比如开始活动的结果然后你只是对那个调用中的UI东西或者排序找出一种方法让GUI在某个时候以某种方式调用然后检查服务是否完成gui中的一份报告