2016-12-22 11 views
1

У меня проблема с моим сервисом android. В «onLocationChanged» я хочу получить доступ к статическому члену моего класса «Устройство».Доступ к сервису Android для статического члена другого класса

Я начинаю свою службу с:

Intent i = new Intent(this, LocationService.class); 
    startService(i); 

Это мой класс LocationListener с сервисом:

private class LocationListener implements android.location.LocationListener{ 
    Location mLastLocation; 
    LocationListener(String provider) 
    { 
     Log.e(TAG, "LocationListener " + provider); 
     mLastLocation = new Location(provider); 
    } 
    @Override 
    public void onLocationChanged(Location location) 
    { 
     Device.getLocationType().setLocationData(location); 
    } 

    @Override 
    public void onProviderDisabled(String provider) 
    { 
     //... 
    } 

    @Override 
    public void onProviderEnabled(String provider) 
    { 
     //... 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) 
    { 
     //... 
    } 
} 


LocationListener[] mLocationListeners = new LocationListener[] { 
     new LocationListener(LocationManager.GPS_PROVIDER), 
     new LocationListener(LocationManager.NETWORK_PROVIDER) 
}; 


@Override 
public IBinder onBind(Intent arg0) 
{ 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    super.onStartCommand(intent, flags, startId); 
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); 
    Log.d(TAG, "onStartCommand"); 
    return START_STICKY; 
} 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    Log.d(TAG, "onCreate"); 
    initializeLocationManager(); 
    try { 
     mLocationManager.requestLocationUpdates(
       LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, 
       mLocationListeners[1]); 
     Log.d(TAG, "try"); 
    } catch (java.lang.SecurityException ex) { 
     Log.d(TAG, "fail to request location update, ignore", ex); 
    } catch (IllegalArgumentException ex) { 
     Log.d(TAG, "network provider does not exist, " + ex.getMessage()); 
    } 
    try { 
     mLocationManager.requestLocationUpdates(
       LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, 
       mLocationListeners[0]); 
     Log.d(TAG, "try2"); 
    } catch (java.lang.SecurityException ex) { 
     Log.d(TAG, "fail to request location update, ignore", ex); 
    } catch (IllegalArgumentException ex) { 
     Log.d(TAG, "gps provider does not exist " + ex.getMessage()); 
    } 
} 

@Override 
public void onDestroy() 
{ 
    Log.e(TAG, "onDestroy"); 
    super.onDestroy(); 
    if (mLocationManager != null) { 
     for (int i = 0; i < mLocationListeners.length; i++) { 
      try { 
       mLocationManager.removeUpdates(mLocationListeners[i]); 
      } catch (Exception ex) { 
       Log.i(TAG, "fail to remove location listners, ignore", ex); 
      } 
     } 
    } 
} 


private void initializeLocationManager() { 
    Log.e(TAG, "initializeLocationManager"); 
    if (mLocationManager == null) { 
     mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
    } 
} 

Мой класс устройств

public class Device { 
private static LocationType locationType; 

//... 
} 

А класс LocationType

public class LocationType { 
private Location location; 

public LocationType(){ 

    //... 
} 

Location getLocationData() { 
    return location; 
} 

void setLocationData(Location location) { 
    this.location = location; 
} 
} 

Мое приложение не выполнено, потому что у меня нет права доступа к статическому члену из службы? Как я могу получить доступ к этому статическому члену?

Большое спасибо за ваш ответ.

ответ

0

Вы используете Device.getLocationType() Вы уверены, что этот метод также является статическим? Поэтому либо сделайте его статическим, либо сделайте locationType общедоступным и получите доступ к нему напрямую.

Хотите ли вы, чтобы это было совсем другое.

Кроме того, попробуйте заменить:

private static LocationType locationType; 

с:

private static LocationType locationType = new LocationType(); 
+0

Да, метод getLocationType() в устройстве статичен. И он возвращает объект LocationType.И я хочу вызвать метод «setLocationData» этого объекта. («setLocationdData» является «защищенным», поэтому он может быть использован в одном пакете.) – Banana

+0

Можете ли вы опубликовать трассировку стека ошибки? –

+0

Это очень странно, но в журнале консоли ничего не отображается. Только приложение отображает сообщение «приложение остановилось». Я нажимаю «ok», и приложение все еще работает. Это сообщение отображается каждый раз, когда программа входит в «onLocationChanged». – Banana

0

Вы поле является частным

private static LocationType locationType; 

сделать его общедоступным, и она должна быть доступна

public static LocationType locationType; 

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

+0

У меня есть getter для этого частного статического члена: public static LocationType getLocationType() {return Device.locationType; } И я использую getter, чтобы получить объект LocationType в методе OnLocationChanged LocationType type = Device.getLocationType(); – Banana

+0

Попробуйте не ссылаться на него, как 'Device.locationType' покупать так же, как' locationType'. Поскольку метод уже статичен, вы должны иметь доступ к нему так. –

+0

Уже пробовал. Я читал это: http://stackoverflow.com/questions/15325882/using-activity-class-static-members-in-a-background-service Я думаю, что так и происходит в моем случае. Но я не понимаю, как я могу это исправить .... – Banana

0

Мой объект "locationType" всегда определяется обнулить ... В моей MainActivity, я называю метод Device.init (...). Этот метод создает объект LocationType в статическом члене.

public class Device { 
private static LocationType locationType; 

public static void init(...){ 
    Device.locationType = new LocationType(...); 

    if(Device.locationType != null){ 
     Intent i = new Intent(activity, LocationService.class); 
     activity.startService(i); 
    } 
} 

Моя служба запущена, но в методе обслуживания «onLocationChanged», то Device.locationType равно нулю.