2010-08-20 3 views
-1

У меня есть MapOverlay. Следующая строка бросает NullPointer, но я не понимаю, почему: S mapView.getProjection().toPixels(p, screenPts); может кто-нибудь мне помочь?Nullpointer Exception

public class Mapview extends MapActivity { 
GeoPoint p; 
MapView mapView; 
MapController mc; 

@Override 
protected boolean isRouteDisplayed() { 
return false; 
} 
public int icount = 0; 
MapController mapController; 
MyPositionOverlay positionOverlay; 
private LocationData tweets; 
public int start = 0; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 



MapView myMapView = (MapView)findViewById(R.id.mapView); 

myMapView.setSatellite(true); 
myMapView.setStreetView(true); 
myMapView.displayZoomControls(false); 
mapController = myMapView.getController(); 

mapController.setZoom(17); 
myMapView.setBuiltInZoomControls(true); 

//Adding points here 


//---Add a location marker--- 
MapOverlay mapOverlay = new MapOverlay(); 
List<Overlay> listOfOverlays = myMapView.getOverlays(); 
listOfOverlays.clear(); 
listOfOverlays.add(mapOverlay);   

myMapView.invalidate(); 

// Add the MyPositionOverlay 
positionOverlay = new MyPositionOverlay(); 
List<Overlay> overlays = myMapView.getOverlays(); 
overlays.add(positionOverlay); 


LocationManager locationManager; 
String context = Context.LOCATION_SERVICE; 
locationManager = (LocationManager)getSystemService(context); 

Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
criteria.setAltitudeRequired(false); 
criteria.setBearingRequired(false); 
criteria.setSpeedRequired(false); 
criteria.setCostAllowed(true); 
String provider = locationManager.getBestProvider(criteria, true); 


locationManager.requestLocationUpdates(provider, 2000, 10, locationListener); 
Location location = locationManager.getLastKnownLocation(provider); 
updateWithNewLocation(location); 

} 


private final LocationListener locationListener = new LocationListener() { 
public void onLocationChanged(Location location) { 
    updateWithNewLocation(location); 
} 

public void onProviderDisabled(String provider){ 
    updateWithNewLocation(null); 
} 

public void onProviderEnabled(String provider){ } 
public void onStatusChanged(String provider, int status, 
          Bundle extras){ } 
}; 

private void updateWithNewLocation(Location location) { 
String latLongString =""; 
TextView myLocationText; 
myLocationText = (TextView)findViewById(R.id.myLocationText); 
String addressString = "No address found"; 

if (location != null) { 
    // Update my location marker 
    positionOverlay.setLocation(location); 

    // Update the map location. 
    Double geoLat = location.getLatitude()*1E6; 
    Double geoLng = location.getLongitude()*1E6; 
    GeoPoint point = new GeoPoint(geoLat.intValue(), 
           geoLng.intValue()); 

    mapController.animateTo(point); 

    double lat = location.getLatitude(); 
    double lng = location.getLongitude(); 
    latLongString = "Lat:" + lat + "\nLong:" + lng; 
    Global.lat = lat; 
    Global.lng = lng; 
    double latitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 

    Geocoder gc = new Geocoder(this, Locale.getDefault()); 
    try { 
    List<Address> addresses = gc.getFromLocation(latitude, 
               longitude, 1); 
    StringBuilder sb = new StringBuilder(); 
    if (addresses.size() > 0) { 
     Address address = addresses.get(0); 

     for (int i = 0; i < address.getMaxAddressLineIndex(); i++) 
     sb.append(address.getAddressLine(i)).append("\n"); 

     sb.append(address.getLocality()).append("\n"); 
     sb.append(address.getPostalCode()).append("\n"); 
     sb.append(address.getCountryName()); 
    } 
    addressString = sb.toString(); 
    } catch (IOException e) {} 
} else { 
    latLongString = "No location found"; 
} 
} 

class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean draw(Canvas canvas, MapView mapView, 
    boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     //---translate the GeoPoint to screen pixels--- 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(p, screenPts); 

     //---add the marker--- 
     Bitmap bmp = BitmapFactory.decodeResource(
      getResources(), R.drawable.marker);    
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);   
     return true; 
} 

} 
} 
+0

Я не вижу, где 'p' происходит от ... – WarrenFaith

+0

Он объявлен как' Geopoint p; 'раньше. Я добавил больше кода, чтобы сделать это более ясным. – Skizit

+0

спасибо. Я не могу исправить ошибку, вы узнали, какой объект имеет значение null? – WarrenFaith

ответ

2

Я вижу декларацию GeoPoint p, но не выражение, где p фактически инициализирована. Поэтому прохождение null в метод toPixels() может стать причиной для NPE.

Попробуйте этот код вместо того, чтобы проверить, если NPE ушел:

//---translate the GeoPoint to screen pixels--- 
    if (p == null) return false; 
    Point screenPts = mapView.getProjection().toPixels(p, null); 

(мне не нравится «из» параметров в Java, toPixels создаст точечный объект для вас и вернуть его)

+0

Ваш код помог мне отладить его дальше. Я смог решить оставшуюся часть. В принципе, я не давал p очко :) спасибо человеку. – Skizit

+0

Это то, чего я ожидал. Единственными причинами для NPE в этом месте были бы «нуль» вместо MapView или «null» вместо проекции, и один из этих случаев был бы серьезной ошибкой для android;) –

0

Хорошо, кажется, что публичный атрибут GeoPoint p никогда не ссылается таким образом pointint on null. Может быть, вы хотите, чтобы определить р в этой строке:

GeoPoint точка = новый GeoPoint (geoLat.intValue(), geoLng.intValue());

Вы должны найти корредтное место для назначения p, тогда проблема будет исправлена.

0

Вам необходимо сохранить ссылку на myMapView, которую вы будете использовать позже. Способ сделать это - объявить его как свойство, используя атрибут strong.