2011-09-16 39 views
0

我從Web服務獲取經度和緯度,並在Google地圖上顯示結果(標記)..但我有時會收到以下錯誤。 .n申請強制關閉...... 我該如何解決/處理這個..? 建議是極大的讚賞...java.lang.NullPointerException在地圖上的覆蓋層上點擊

 09-16 14:51:41.359: ERROR/AndroidRuntime(27858): java.lang.NullPointerException 
     09-16 14:51:41.359: ERROR/AndroidRuntime(27858):  at com.google.android.maps.ItemizedOverlay.getItemsAtLocation(ItemizedOverlay.java:617) 
     09-16 14:51:41.359: ERROR/AndroidRuntime(27858):  at com.google.android.maps.ItemizedOverlay.getItemAtLocation(ItemizedOverlay.java:586) 
     09-16 14:51:41.359: ERROR/AndroidRuntime(27858):  at com.google.android.maps.ItemizedOverlay.handleMotionEvent(ItemizedOverlay.java:498) 
     09-16 14:51:41.359: ERROR/AndroidRuntime(27858):  at com.google.android.maps.ItemizedOverlay.onTouchEvent(ItemizedOverlay.java:572) 
     09-16 14:51:41.359: ERROR/AndroidRuntime(27858):  at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63) 
     09-16 14:51:41.359: ERROR/AndroidRuntime(27858):  at com.google.android.maps.MapView.onTouchEvent(MapView.java:679) 
     09-16 14:51:41.359: ERROR/AndroidRuntime(27858):  at android.view.View.dispatchTouchEvent(View.java:3932) 

我爲顯示覆蓋代碼:

  class backgroundLoadResults extends 
AsyncTask<Void, Void, Void> { 
     Handler mHandler = new Handler(Looper.getMainLooper()); 
     String message = null; 
     double mylat = 0 ,mylon = 0; 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     //getListView().addHeaderView(buildHeader()); 
     dialog.dismiss(); 
     if(markerssList.getLatitude().size() < 0 ||markerssList.getLatitude().size() == 0) 
     { 
      AlertDialog.Builder alertbox = new AlertDialog.Builder(SActivity.this); 
      alertbox.setMessage("No result found..Please try later.."); 
      alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface arg0, int arg1) { 
       } 
      }); 
      alertbox.show(); 
     } 
     tb2.setEnabled(true); 
     super.onPostExecute(result); 


    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mHandler.post(new Runnable() { 
       public void run() { 
        dialog = ProgressDialog.show(SActivity.this, "", 
         "Showing the results,Please wait...", true); 
       dialog.show(); 
       } 
     }); 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgress(progress[0]); 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 

     // TODO Auto-generated method stub 
     geocoder = new Geocoder(SActivity.this); //<3> 
     location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     if (!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
      //buildAlertMessageNoGps(); 
     } 


     if (location != null) 
     { 
      message = String.format("\n Longitude: %1$s \n Latitude: %2$s", 
        location.getLongitude(), location.getLatitude()); 
      mylat = location.getLatitude() ; 
      mylon = location.getLongitude(); 
     } 
     System.out.println(""+mylat+mylon); 

      try { 

       /** Handling XML */ 
       SAXParserFactory spf = SAXParserFactory.newInstance(); 
       SAXParser sp = spf.newSAXParser(); 
       XMLReader xr = sp.getXMLReader(); 
       //    mylat = -33.853468 ; 
       //    mylon = 150.94042160000004; 
       item = spinner.getSelectedItemPosition(); 

       int radi = 0; 
       if(item == 1) 
       {radi = 5;} 
       if(item == 2) 
       {radi = 10155;} 
       if(item == 3) 
       {radi = 10155;} 

       System.out.println("just above the urll"+mylat+mylon); 
       /** Send URL to parse XML Tags */ 
       URL sourceUrl = new URL("XXXXXXXXXXXXXXXXXXX?lat="+mylat+"&lng="+mylon+"&radius="+radi); 
       System.out.println(" the urll "+sourceUrl); 
       /** Create handler to handle XML Tags (extends DefaultHandler) */ 
       myXMLHandler = new MyXMLHandler(); 
       xr.setContentHandler(myXMLHandler); 
       xr.parse(new InputSource(sourceUrl.openStream())); 

      } 

      catch (Exception e) { 



      } 

      markerssList = MyXMLHandler.markerList; 


      System.out.println("lenghttttt"+markerssList.getLatitude().size()); 
      Drawable drawable = ShowroomLocatorActivity.this.getResources().getDrawable(R.drawable.icon); 
      CustomItemizedOverlay itemizedOverlay = new CustomItemizedOverlay(drawable, ShowroomLocatorActivity.this); 

      for (int i = 0; i < markerssList.getLatitude().size(); i++) { 

       // **Is this correct??** 
       ss1 = markerssList.getLatitude().get(i); 
       ss2 = markerssList.getLongitude().get(i); 
       ss3 = markerssList.getName().get(i); 
       ss4 = markerssList.getAddress().get(i); 
       ss5 = markerssList.getCity().get(i); 
       System.out.println("lat...."+ ss1); 
       System.out.println("llogitude......."+ ss2); 
       Log.i("latitude..." + i, ss1); 
       Log.i("longitude.."+i,ss2); 

       { 

        p = new GeoPoint((int) (Double.parseDouble(ss1) * 1E6), 
          (int) (Double.parseDouble(ss2) * 1E6)); 
        OverlayItem overlayItem = new OverlayItem(p, " ", 
          ""+ss3+"\n"+ss4+"\n"+ss5); 
        itemizedOverlay.addOverlay(overlayItem); 
        //mapController.animateTo(p); 
        //mapController.setZoom(17); 
       } 
       catch(Exception e1) 
       {System.out.println("newwww"+e1);} 

      } 

      mapView.getOverlays().add(itemizedOverlay); 
      mapController = mapView.getController(); 
      mapController.animateTo(p); 
      mapController.setZoom(10); 
      mapView.postInvalidate(); 



     return null; 
    } 

} 

}

我對覆蓋中的onTap方法:

 protected boolean onTap(int index) { 
     OverlayItem item = mapOverlays.get(index); 
     AlertDialog.Builder dialog = new AlertDialog.Builder(context); 

     dialog.setTitle(item.getTitle()); 
     dialog.setMessage(item.getSnippet()); 
     dialog.setIcon(R.drawable.icon); 
     dialog.setNegativeButton("go to direction", new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface dialog, int id) { 
       System.out.println("get directions..."+ss4+ss5); 


      } }); 
     dialog.setNeutralButton("buisness card", new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface dialog, int id) { 

       //... 

      } }); 

     //dialog.setPositiveButton("Get Direction", this); 
     dialog.show(); 
     return true; 
    } 
+0

好像你正在尋找在錯誤的地方。你的堆棧跟蹤說問題出在android.view.View.dispatchTouchEvent()方法中。以調試模式運行並查看是否將null作爲參數傳遞給API。 – Sundeep

+0

請顯示您的onTouch()方法代碼 – Pratik

+0

@pratik:我只是編輯了問題.. –

回答

1

我有確切同樣的錯誤;當觸摸地圖時。

原因;我發現在數據列表中缺少至少一個overlayitem。

您可能需要將默認overlayitem添加到itemizedOverlay集合。檢查你的初始化班級,並嘗試做這樣的事情。

overlays = mapV.getOverlays(); 
Drawable drawable = this.getResources().getDrawable(R.drawable.someicon); 
Test1ItemizedOverlay testingMapsItemizedOverlay = new Test1ItemizedOverlay(drawable, this); 
GeoPoint point = new GeoPoint(55791764,12377150); 
OverlayItem overlayitem = new OverlayItem(point, "First overlay item!", "Here, I am!"); 
testingMapsItemizedOverlay.addOverlay(overlayitem); 
overlays.add(testingMapsItemizedOverlay); 
1

你可能只是試試這個:

if(testingMapsItemizedOverlay.size > 0) 
overlays.add(testingMapsItemizedOverlay); 
+0

+1謝謝它爲我工作 –