【问题标题】:Google Map crash null LatLng谷歌地图崩溃 null LatLng
【发布时间】:2014-01-28 05:14:28
【问题描述】:

所以我有我的谷歌地图,我所做的就是从我的服务器获取纬度和经度作为字符串,然后将它们转换为 LatLng 位置。我遇到的问题是,如果手机没有获取 gps 位置,它会在我的数据库中存储一个空字符串,然后当谷歌地图尝试显示它时,它会为所有尝试访问地图的用户崩溃我的应用程序。我收集的是空字符串,因为如果我从我的数据库中删除那个字符串,一切都会再次正常工作。我需要知道的是检查空字符串或 null LatLng 并跳过它以免崩溃的最佳方法。

编辑代码已更新

for (int i = 0; i < marker_list.size(); i+=2)
{
              String lat = marker_list.get(i);
              String lng = marker_list.get(i+1);

              // NEED TO MAKE SURE CHECK BEFORE HERE AND IF LOCATION DOESN'T EXIST SKIP TO NEXT.
              if (lat == "" || lng == "")
              {
                  continue;
              }
              else
{
              double lat_ = Double.valueOf(lat);
          double lng_ = Double.valueOf(lng);

              LatLng location = new LatLng(lat_, lng_);

              map.addMarker(new MarkerOptions()
                    .position(location)
                    .title(title)
                    .snippet(index)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.event)));
 }

}


01-28 00:33:58.060: E/AndroidRuntime(919): FATAL EXCEPTION: main
01-28 00:33:58.060: E/AndroidRuntime(919): Process: com.databasedemo, PID: 919
01-28 00:33:58.060: E/AndroidRuntime(919): java.lang.NumberFormatException: Invalid double: ""
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.StringToReal.invalidReal(StringToReal.java:63)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.StringToReal.parseDouble(StringToReal.java:248)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.Double.parseDouble(Double.java:295)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.Double.valueOf(Double.java:332)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.databasedemo.Map$PrefetchData.onPostExecute(Map.java:257)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.databasedemo.Map$PrefetchData.onPostExecute(Map.java:1)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.AsyncTask.finish(AsyncTask.java:632)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.Handler.dispatchMessage(Handler.java:102)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.Looper.loop(Looper.java:136)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.app.ActivityThread.main(ActivityThread.java:5017)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.reflect.Method.invokeNative(Native Method)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.reflect.Method.invoke(Method.java:515)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-28 00:33:58.060: E/AndroidRuntime(919):  at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 请发布您的 logcat 错误。你得到String latString lng null 吗?
  • 如果您要检查字符串的值是否为“null”,请改用 if ("null".equals(lat) && "null".equals(lng))
  • 使用 if ("null".equals(lat) && "null".equals(lng)) 还是一样的错误

标签: android google-maps


【解决方案1】:

尝试如下:

     String lat = marker_list.get(i);
     String lng = marker_list.get(i+1);
     if(!lat.isEmpty() && !lng.isEmpty())
     {
        try{
         double lat_ = Double.parseDouble(lat);
         double lng_ = Double.parseDouble(lng);
    }catch(NumberFormatException e){}
       }

【讨论】:

  • 它不会保存。说 lat_, lng_ 无法解析为这一行的变量。 LatLng 位置 = 新 LatLng(lat_, lng_);
  • 在这里尝试捕获没有意义。即使捕获到异常,值仍然是错误的。
  • 检查字符串的空值。检查我更新的答案。你得到lat lng 的值了吗?
  • 我用过 if(lat.isEmpty() && lng.isEmpty()){ continue; ,它的工作原理。非常感谢。
【解决方案2】:

在声明字符串后添加这一行。

if (lat == "" || lng == "") {
   continue;
}

这将跳过您有空字符串的迭代,这些字符串为您提供空位置

【讨论】:

  • lat == "" || lng == "" 和 lat.equals("") || lng.equals("") -- 这些都不起作用,仍然会使应用程序崩溃。
  • @user3186578 如果没有错误消息,您将无法获得正确的解决方案,因此请发布您遇到的错误。
  • 尝试将 "" 更改为 null。我认为字符串是空的,而不是空的。所以说 if (lat == null || lng == null)
  • 添加了 logcat。我知道它是双重的,只是不确定如何检查它..也尝试过 lat lng == null 并且仍然相同。我是否需要检查 double 而不是 null?
  • @user3186578 发生了什么,你的字符串是空的。因此,当您从字符串创建双精度时,它会给您一个错误,因为字符串不包含数字。即使您按照我的回答,我也不明白为什么您仍然会收到此错误。您确定在声明双打之前将 if 语句放在我的答案中吗?
【解决方案3】:

发生的情况是,您从数据库中提取的信息无法格式化为数字。你可以让它工作,但在我看来,最好的解决方案是不在你的数据库中存储损坏或无效的值。因此,只需等待设备获取位置更新,然后再将某些内容推送到数据库,或者根本不放置任何内容。另外,为什么要将位置存储为字符串?您可以将其作为数字推入,这样您就不需要每次都对其进行序列化和反序列化。

【讨论】:

  • 这是我的第一个 android 应用程序,我通常使用 php/mysql,所以我可以根据需要使其工作。而且不是我存储位置,我让用户存储位置,如果他们在 gps 完全锁定之前单击添加位置按钮,它会插入空白值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2015-06-10
相关资源
最近更新 更多