我正在我的应用程序中使用谷歌地图。第一次正确加载google Maps时,点击页面上有一个按钮,但再次转到该页面并点击该按钮会使我的应用程序崩溃。
这是我的代码:
public class GoogleMaps extends Activity { MapFragment googleMapFragment = null; private static GoogleMap googleMap = null; private String provider; MarkerOptions marker; double latitude, longitude; private LocationManager locationManager; ParseGeoPoint myLatLng[]; int count_place, i = 0; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.googlemap_view); try { initilizeMap(); initParse(); } catch (Exception e) { // TODO: handle exception Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show(); } } private void initParse() { // TODO Auto-generated method stub Parse.initialize(this, "key","key"); ParseObject plcobj = new ParseObject("Details"); getLatLong(); ParseGeoPoint myGeoPiont = new ParseGeoPoint(latitude, longitude); ParseGeoPoint userLocation = (ParseGeoPoint) plcobj.get("location"); final ParseQuery query = ParseQuery.getQuery("Details"); query.whereNear("location", myGeoPiont); query.setLimit(10); query.whereWithinKilometers("location", myGeoPiont, 10); query.findInBackground(new FindCallback() { @Override public void done(List objects, ParseException e) { // TODO Auto-generated method stub if (e == null) { Iterator Itr = objects.iterator(); while (Itr.hasNext()) { ParseObject plcObjNext = (ParseObject) Itr.next(); myLatLng[i] = plcObjNext.getParseGeoPoint("location"); i++; // Line 76 } } } }); } private void initilizeMap() { if (googleMap == null) { googleMapFragment = ((MapFragment) getFragmentManager() .findFragmentById(R.id.map)); googleMap = googleMapFragment.getMap(); googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); if (googleMap == null) { Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT) .show(); } googleMap.setMyLocationEnabled(true); Log.e("Maps", "------EOC-------"); // Get the location manager } } public void getLatLong() { GPSTracker gps = new GPSTracker(GoogleMaps.this); if (gps.canGetLocation()) { longitude = gps.getLongitude(); latitude = gps.getLatitude(); Toast.makeText(getApplicationContext(), longitude + " " + latitude, Toast.LENGTH_SHORT).show(); } // return boolean true/false else { gps.showSettingsAlert(); } } }
这是我的日志:
10-18 13:37:24.219 E/AndroidRuntime(21624): FATAL EXCEPTION: main 10-18 13:37:24.219 E/AndroidRuntime(21624): java.lang.NullPointerException 10-18 13:37:24.219 E/AndroidRuntime(21624): at com.example.restaurantfinder.GoogleMaps$1.done(GoogleMaps.java:76) 10-18 13:37:24.219 E/AndroidRuntime(21624): at com.parse.FindCallback.internalDone(FindCallback.java:45) 10-18 13:37:24.219 E/AndroidRuntime(21624): at com.parse.FindCallback.internalDone(FindCallback.java:1) 10-18 13:37:24.219 E/AndroidRuntime(21624): at com.parse.Parse$6$1.run(Parse.java:888) 10-18 13:37:24.219 E/AndroidRuntime(21624): at android.os.Handler.handleCallback(Handler.java:605) 10-18 13:37:24.219 E/AndroidRuntime(21624): at android.os.Handler.dispatchMessage(Handler.java:92) 10-18 13:37:24.219 E/AndroidRuntime(21624): at android.os.Looper.loop(Looper.java:137) 10-18 13:37:24.219 E/AndroidRuntime(21624): at android.app.ActivityThread.main(ActivityThread.java:4517) 10-18 13:37:24.219 E/AndroidRuntime(21624): at java.lang.reflect.Method.invokeNative(Native Method) 10-18 13:37:24.219 E/AndroidRuntime(21624): at java.lang.reflect.Method.invoke(Method.java:511) 10-18 13:37:24.219 E/AndroidRuntime(21624): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 10-18 13:37:24.219 E/AndroidRuntime(21624): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 10-18 13:37:24.219 E/AndroidRuntime(21624): at dalvik.system.NativeStart.main(Native Method)
您的问题是ParseGeoPoint数组为空。
当编译器看到parsegeopoint mylatlng[];
时,它会创建一个指向没有内存的空数组的指针,因此当您试图通过mylatlng[i]
访问内存时,会返回一个空指针,因为内存不存在,而写入空指针会引发一个NullPointerException,因为您需要意识到这样的错误。您不会想在以后的时间里什么都不写而没有数据。在C语言中,如果您写入一个空数组,它将覆盖内存的另一部分,而不是抛出一个异常,从而导致潜在的难以跟踪bug。
在尝试写入数组之前,需要用适当的大小初始化数组。在Java中,数组使用以下语法初始化为固定长度,该语法使用长度3:
ParseGeoPoint mylatlng[]=new ParseGeoPoint[3];
或者在parseGeoPoint mylatlng[];
之后某个时间键入mylatlng[]=new parseGeoPoint[3];
在您的情况下:
mylatlng[]=new parseGeoPoint[objects.size()];
之前,您要遍历对象并尝试写入数组。不能写入空指针。您需要告诉编译器指向哪里以及分配多少空间。
在处理项目列表时,您可能会发现ArrayList
和其他list
对象很有帮助。他们提供了很多方便的方法,可以节省你的时间,如果你需要他们,他们不需要固定的长度。当您添加时,它们会提供不断增加的存储空间,直到内存耗尽为止。
它将对您有很大的帮助,并为您节省大量学习如何调试空指针的时间。它们是一个非常常见的异常,大多数时候调试空指针是很简单的。
因此,您正在调用initlizeMap();
然后调用initParse();
在initParse
中,我们有一个对象列表。因此当您从一个activity到另一个时,对象将变为空。当你回来的时候,试着把它保存在某个地方来获取这些对象。
Build.Gradle
(1)https://stackoverflow.com/questions/34247347/initialize-google-map-to-zoom-to-bounds(2)bounds google maps (3)在google maps android api v2中设置最大缩放级别(4)android map v2缩放显示所有标记 (5)在android中调整google map(a
问题内容: 您如何计算Google Maps V3中两个标记之间的距离?(类似于inV2中的功能。) 谢谢.. 问题答案: 如果要自己计算,可以使用Haversine公式:
所以我看到了一个特殊的例外,我敢肯定的是谷歌地图的绘图代码。 我有一个片段,在那里我以编程方式添加了一个支持地图片段,然后我在其中操纵谷歌地图实例。 这是stacktrace: 我无法可靠地复制它(尽管这种情况经常发生),我已经查看了ReadWriteDirectByteBuffer和ShortToByteBufferAdapter,但没有任何东西突然出现在我面前。 有什么想法吗?
我认为问题是我需要添加构建提示。我可以找到在哪里添加他们,但我不确定他们应该是什么格式。我也不知道要补充什么。我想我发现了一个帖子,说我需要添加Android.xapplication=Android:value=“Your Key”/>Android.xPermissions= 但我不确定构建提示条目表单中的格式是什么
LSV默认的对谷歌影像进行了加载,如果需要加载其他的谷歌地图数据,可以通过LSV中直接点击即可加载。