【问题标题】:Method works in OnResume() but not in OnCreate()方法在 OnResume() 中有效,但在 OnCreate() 中无效
【发布时间】:2016-01-09 14:39:41
【问题描述】:

我有一个小应用程序可以获取位置,然后将其显示在地图上。

onCreate() 中,我启动了LocationService 和地图。然后我想调用我的setLocation() 方法来确定我的位置并将其显示在地图上。

如果我从onCreate() 调用setLocation() 方法,它将不起作用,并且会显示吐司。如果我从onResume() 打电话给setLocation(),它就可以工作。这可能是什么原因?

来源:Github

感谢您的帮助。如果您需要其余代码的某个部分,请告诉我。

【问题讨论】:

  • 我们不知道mapActivity 是什么,我们不知道GPSService 是什么,我们不知道GPSService 上的getPos() 是什么,等等。
  • 添加了整个源代码
  • 您是否尝试过在带有断点的服务调用中使用调试器来查看为什么返回的位置为空?
  • 另外,您似乎拥有 GPS 服务的方式非常无用,因为您直接从 Activity 使用同步方法调用访问它
  • 似乎 OnMapReady() 在 setLocation 之后被调用,因此 mapActivity 为空,虽然我先创建了 mapFragment,但可能是什么原因?

标签: java android oncreate onresume


【解决方案1】:

永远不要通过构造函数自己创建服务实例。 GPSService 根本没有理由存在,更不用说成为 Service 了。话虽如此,getPos() 将返回null,直到您获得位置修复。确切的时间是不确定的。

同样,永远不要通过构造函数自己创建活动实例。 MapsActivity 根本没有理由存在,更不用说成为Activity 的实际子类了。话虽如此,MainActivity 中的 mapActivity 字段将是 null,直到调用 onMapAsync()。具体何时发生也不确定。

因此,您不能可靠地从onCreate()onResume() 调用setLocation()。毕竟,您可能永远无法真正获得位置。

此外,如果您的 targetSdkVersion 为 23 或更高,您的应用程序将在 Android 6.0+ 设备上崩溃,因为您甚至在请求运行时权限之前就尝试获取位置,更不用说授予它。

在您获得位置和地图之前,无法拨打您的mapActivity.moveCamera(location) 电话。您需要安排在onMapReady()onLocationChanged() 中查看您是否拥有这两条数据,然后然后调用mapActivity.moveCamera(location)

另外,FWIW,您的 WRITE_EXTERNAL_STORAGE <uses-permission> 元素在清单中的位置错误。 <uses-permission> 元素必须是根 <manifest> 元素的直接子元素,而不是 <application> 的子元素。

【讨论】:

  • 首先感谢您的回答,我是 Android 开发的新手,我对这样的建议很满意。所以你建议把它全部放在 MainActivity 中而不是将它分成几个类?我怎样才能确保一切都以正确的顺序调用?
  • @strange-matter:“所以你建议把它全部放在 MainActivity 中,而不是把它分成几个类?” - 对于您目前拥有的功能级别,我看不出额外的类在哪里给您带来任何好处。 “我怎样才能确保一切都以正确的顺序调用?” ——嗯,在很大程度上,这与经验有关。从技术上讲,让onMapReady()onLocationChanged() 调用一些通用方法来查看您是否满足这两个要求(地图+位置),然后在满足两个要求时该方法调用moveCamera()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2013-06-07
  • 2014-06-19
  • 2019-05-26
  • 1970-01-01
相关资源
最近更新 更多