方法适用于OnResume()但不适用于OnCreate()

时间:2016-01-09 14:39:42

标签: java android oncreate onresume

我有一个小应用程序来获取位置,然后在地图上显示它。

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

如果我从setLocation()调用onCreate()方法,它就不起作用并显示吐司。如果我从setLocation()致电onResume(),那就有效。可能是什么原因?

来源:Github

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

1 个答案:

答案 0 :(得分:0)

永远不要通过构造函数自己创建服务实例。 GPSService没有任何理由存在,更不用说是Service了。话虽如此,getPos()将返回null,直到您获得位置修复为止。究竟何时会发生这种情况是不确定的。

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

因此,您无法从setLocation()onCreate()可靠地致电onResume()。毕竟,你可能无法真正获得一个位置。

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

在您拥有位置并拥有地图之前,无法进行mapActivity.moveCamera(location)来电。您需要安排在onMapReady()onLocationChanged()中查看您是否同时拥有这两项数据,然后调用mapActivity.moveCamera(location)

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