0

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

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

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

4

2 回答 2

1

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

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

如何使用 AsyncTask 获取位置

于 2012-12-18T11:34:32.180 回答
1

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

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

它是什么

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

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

为什么我需要它

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

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

你的情况

您指的是您正在使用LocationManager和一个Handler. 这些类都没有暗示使用不同的线程。

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

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

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

希望能帮助到你。如果您需要更多说明,请告诉我。

问候。

于 2012-12-18T14:50:20.977 回答