【问题标题】:Problem with crash with ItemizedOverlayItemizedOverlay 崩溃问题
【发布时间】:2013-10-04 11:46:01
【问题描述】:

我已经尝试了几个小时来弄清楚为什么在将逐项地图叠加添加到地图的叠加之前,我不能不这样做就不能使用它:

GeoPoint point; OverlayItem overlayitem = new OverlayItem(point, "",""); MarkerOverlay.addOverlay(overlayitem);

如果我尝试在没有MarkerOverlay.addOverlay(overlayitem); 命令的情况下执行此操作,那么当我尝试像这样添加新的覆盖时:

public boolean onTap(GeoPoint point, MapView mapView)
{
    if (mOverlays.size() > 0)
        mOverlays.remove(0);
    OverlayItem overlayitem = new OverlayItem(point, "", "");
    mOverlays.add(overlay);
    populate();
    return true;
}

在我的 ItemizedOverlay 类中,我只得到一个空引用异常(我不知道何时或为什么 - 它说它在调试时没有可用的源代码)

有什么想法吗?

编辑: 这是我可以在 logcat 中找到的:

09-20 22:36:22.164: WARN/dalvikvm(311): threadid=3: thread exiting with uncaught exception (group=0x4001b188)

这就是我认为臭名昭著的例外:

   09-20 22:36:22.293: ERROR/AndroidRuntime(311): java.lang.NullPointerException
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.getItemsAtLocation(ItemizedOverlay.java:617)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.getItemAtLocation(ItemizedOverlay.java:586)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.handleMotionEvent(ItemizedOverlay.java:498)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.ItemizedOverlay.onTouchEvent(ItemizedOverlay.java:572)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.google.android.maps.MapView.onTouchEvent(MapView.java:625)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.View.dispatchTouchEvent(View.java:3709)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:822)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:822)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:822)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.os.Looper.loop(Looper.java:123)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at android.app.ActivityThread.main(ActivityThread.java:4363)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at java.lang.reflect.Method.invokeNative(Native Method)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at java.lang.reflect.Method.invoke(Method.java:521)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-20 22:36:22.293: ERROR/AndroidRuntime(311):     at dalvik.system.NativeStart.main(Native Method)
09-20 22:36:22.394: ERROR/dalvikvm(311): Unable to open stack trace file '/data/anr/traces.txt': Permission denied

【问题讨论】:

    标签: android


    【解决方案1】:

    我最近遇到了这个问题。此bug report 中概述了该问题。

    要修复它,您应该在填充任何数据之前在 ItemizedOverlay 中调用 populate()。我将它添加到构造函数中:

    private class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    
        private Context context;
        private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    
        LocationItemizedOverlay(Drawable defaultMarker, Context context) {
            super(boundCenterBottom(defaultMarker));
            this.context = context;
            populate(); // Add this
        }
    }
    

    【讨论】:

      【解决方案2】:

      逐项叠加需要第二个 2 参数,因为它将它们用于点击事件。当您单击其中一个逐项叠加时,它具有与之关联的标题和描述,它们是叠加项中的第二个和第三个参数

      【讨论】:

      • 逐项叠加有效,但前提是我在地图视图的 onCreate 上添加一个随机点,否则它会崩溃
      • 哦,我误会了。那你的问题是什么?你的帖子真的很混乱。你能发布确切的有效代码,然后发布无效的确切代码吗?
      • 发布确切的代码是一团糟,因为它在几个文件中。基本上,如果我制作了一个迭代叠加并将其添加到地图的叠加中而不添加叠加项,然后再将其添加到地图的叠加中。然后当我尝试创建一个新的 overlayItem(我在 onTap 方法上执行此操作)时,应用程序会在发布时崩溃。
      • 为什么需要在地图中添加没有任何叠加项目的逐项叠加?
      • 直到用户按下地图,项目才会到达该位置
      【解决方案3】:

      如果您对 ItemizedOverlay 进行了重要更改,那么您每次都可以做

      1. delete_usrer_Marker_from_Overlays(myitemizedoverlay);
      2. create_user_Marker(myitemizedoverlay);
      3. mapView.getOverlays().add(myitemizedoverlay);

      private void delete_usrer_Marker_from_Overlays(MyOverlays myio){
      
          List<Overlay> mapOverlays = mapView.getOverlays();
          if (mapOverlays != null) 
              {
                for (int i = 0;i< mapOverlays.size();i++)
                {
                    Overlay x = mapOverlays.get(i);
                    if (x.hashCode() == myio.hashCode())
                    {
                        mapOverlays.remove(x);
                    }                     
                }
              }       
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多