【问题标题】:Android: gps and handlerAndroid:gps 和处理程序
【发布时间】:2012-12-18 22:50:20
【问题描述】:

我的应用程序必须捕获 gps 坐标并使用处理程序定期发送它们。 在我的 onCreate 方法中:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);

然后onLocationChanged 开始工作。 在 onCreate 结束时,我启动了一个处理程序,它每 2.5 秒做一些事情。 我认为这不是实现目标的正确方法,因为 onLocationChanged() 没有在单独的线程中执行,因此如果处理程序执行 onLocation 将无法执行。
编辑
我不知道如何同时管理 GPS 坐标的检索(如何执行 onLocationChanged)。 计时器每 2.5 秒运行一次任务,同时 onLocationChange 必须设置我在计时器中需要的 gps 值。 我担心 onLocationChange 可能存在根本无法执行的问题。 我想用一个AsyncTask,但是如何执行呢?

【问题讨论】:

  • 您能否更具体地说明您想要实现的目标以及问题所在?
  • @Luis 我已经编辑了我的问题,谢谢。

标签: android gps handler


【解决方案1】:

虽然你已经编辑了你的问题,但我仍然不清楚你到底关心什么。

我会给你一些关于并发的背景信息,让我们看看它是否有帮助......

这是什么

首先,并发意味着软件设计为具有多个线程。这并不意味着多个线程将同时运行,只有当您的设备具有多个内核时才会发生这种情况。如果设备只有一个核心,则一次只运行一个线程,系统会在它们之间切换。

一旦您的系统被设计为具有多个线程,您就必须确保处理共享对象的所有代码(和使用的库)都是线程安全的。

我为什么需要它

您需要使用线程的最常见原因是:

  • 您有一段繁重的代码可以拆分成多个部分,并且您的设备具有多个内核。在这种情况下,您可以从两个(或更多)同时运行的线程处理部分工作中获得性能优势。
  • 您的代码中有一个阻塞操作(即从套接字读取)。这应该被移到一个单独的线程以避免阻塞你的所有程序,直到 socket.read() 返回。
  • 最后,也是 Android 中最常见的一个,任何长时间运行的操作(即超过几秒钟)都应移至与 UI(用户界面)使用的线程不同的线程,以避免用户体验和/或 ANR 错误。

您的情况

您指的是您正在使用LocationManagerHandler。这些类都没有暗示使用不同的线程。

LocationManager 使用回调 onLocationChange() 运行您在 UI 线程中定义的代码。

Handler 在分配处理程序的线程中运行代码。因此,如果您在 UI 线程中创建了处理程序,处理程序回调也将在那里运行。

只有当您创建一个新的Thread(或任何其他具有相同功能的类)时,您才有一个真正的多线程应用程序,需要您小心处理共享对象。

希望对您有所帮助。如果您需要更多说明,请告诉我。

问候。

【讨论】:

    【解决方案2】:

    您可以使用 AsyncTask 来获取数据。

    参考这个问题。希望你能找到答案。

    How To Get Location Using AsyncTask

    【讨论】:

    • 谢谢,但是如果我有单独的计时器来处理这些数据,我可以在哪里调用 asyncTask 执行?
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多