【问题标题】:Is this supposed to take this long?这应该花这么长时间吗?
【发布时间】:2016-04-13 00:29:12
【问题描述】:

我使用LocationManager'srequestLocationUpdates()获取用户打开应用的坐标,获取坐标的时间比其他应用要长。

获取位置需要一段时间,但是当我的应用程序仍在加载和等待位置时(我正在使用LocationManager'srequestLocationUpdates())比其他应用程序要长得多。

这是我启动应用程序时通知面板的屏幕截图:

请注意,当我打开我的应用程序时,它会显示 Finding Location...,因为我的应用程序会在打开应用程序后立即调用 LocationManager's requestLocationUpdates()

这是问题的实质:

即使我在场,如果我导航到谷歌地图之类的应用程序,它也能够在几秒钟内确定我的确切位置。那是因为谷歌地图使用getLastLocation吗?

为什么其他应用获取位置的速度比我的快得多?

【问题讨论】:

    标签: java android database string performance


    【解决方案1】:

    因此有两种获取位置的方法——精细(gps)和粗糙(网络)。 Google Play Services 提供了第三种方法,但它使用了这两种方法的组合。 GPS 需要很长时间——它实际上必须与 2 打左右的卫星中的 7 颗进行通信才能第一次获得位置。网络速度很快,只需要 1 个网络请求(如果数据被缓存则更少)。

    许多应用程序会同时使用这两者,使用网络来获得快速的答案,然后在获取数据时改进为 GPS。我知道地图可以做到这一点。这将使您快速得到不准确的答案,并允许您以后提高准确性。

    您可以使用 getLastKnownLocation 来更快,但您必须能够处理它返回 null。一般网络够快。

    【讨论】:

    • 您说 Google Play 服务使用了这两者的组合。你能解释一下它是如何做到的吗?谢谢
    • 哦,好吧。所以当我得到我的位置时,我将它存储在一个类引用中,并用 getter 和 setter 检索它。如何在初始化对象之前检查存储的值是否为空?例如,用户来到我的应用程序,它开始获取位置,用户让我的应用程序保持打开状态并转到另一个应用程序 30 秒,然后用户回到我的应用程序。当他们回来时,我不想再次请求该位置,因为那样又会花费很多时间。相反,在我的onResume() 中,我想像这样检查:
    • if(myLocationObject == null && myLocationObject.getLongitude() == 0 && myLocationObject.getLatitude() == 0) { startRequestingUpdatesBecauseTheUserHasn'tAlreadyRequestedUpdatesYet();
    • 但是,如果myLocationObject 为空,那么我得到Attempt to invoke virtual method 'double curlybrace.ruchir.appName.LocationClass.getLongitude()' on a null object reference
    • 所以我基本上希望用户能够离开我的应用同时请求位置,所以当他们回来时,如果值不为空,那么我可以使用这些值而不是再次请求。但是,我得到一个空指针异常。我怎样才能解决这个问题?我确信有一个非常简单的解决方案,我只是看不到...... :)
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多