2013-04-22 3 views
2

В основном у меня есть служба android LogService, который я запускаю из моей основной службы. Внутри класса обслуживания я создаю объект класса LocationListener LocationFetcher с именем locationFetcher. LocationFetcher класс имеет открытый член строки FormattedResult. Теперь внутри LogService.run() Я хочу периодически получать FormattedResult. Как это сделать ?? Ниже приведен код для справки.Как получить доступ к внешнему члену класса внутри службы android?

У меня есть LocationListener как это:

/*This is relevant content of LocationFetcher.java */ 

public class LocationFetcher extends TimerTask implements LocationListener{ 

    public String FormattedResult; 
    private boolean availableFlag; 
    @Override 
    public void onLocationChanged(Location arg0) { 
     // TODO Auto-generated method stub 
     this.availableFlag=true; 
     this.FormattedResult=String.format(Locale.ENGLISH, "Lat=\t%f\nLong=\t%f", arg0.getLatitude(),arg0.getLongitude()); 
     Log.d("LocationFetcher",this.FormattedResult); 
    } 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     Log.d("LocationFetcher","This is Timer Run !!!"); 
    }} 

Мой андроида сервис, как это:

/* This is the relevant pert from LogService.java file*/ 

public class LogService extends Service{ 
    private Logger logger; 
    private LocationFetcher locationFetcher; 
    public LocationManager locationManager; 
    private Timer timer1; 

    @Override 
    public int onStartCommand(Intent intent,int flags, int startId){ 
    super.onStartCommand(intent, flags, startId); 
    if(!this.running){ 

     this.logger = new Logger(); //Initiated member from subclass 
     this.logger.start();   //Started 
     this.timer1 = new Timer(); //Timer for timed job   
     this.locationFetcher = new LocationFetcher();//THIS IS MY EXTERNAL CLASS in "LocationFetcher.java" 
             //I am using GPS data. 
     this.locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
     if(this.locationFetcher != null){//NULLPointerException is thrown if I REMOVE this if ??WHY 
      this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this.locationFetcher); 
      this.timer1.scheduleAtFixedRate(this.locationFetcher, 5000, 2000); 
     //Below Line still throws NullPointrException ??WHY 
     //this.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this.locationFetcher); 

     }else{ 
      Log.d("GPS-Logger"," Found Null LocationFlecther !"); 
     } 
    } 
    public void run(){ 
     LogService ll = LogService.this; 
     LocationManager mgr = ll.locationManager; //THIS IS MY QUESTION 
     // HOW DO I ACCESS THE GPS LOCATION STORED in locationmanager.FormattedResult 
     // Which is a string 
     // ////////////////////////////////////////////////////////////////////////// 
     while(ll.isActive){ 

      try { 

       String temp ; 
       if(!temp.isEmpty()){ 
        Log.d("GPS-Logger","data is :"+temp); 
       } 
       Log.d("GPS-Logger","data is :"); 
       Thread.sleep(5000); 
       sec +=1 ; 
       if(sec >= 12){ 
        Log.d("GPS-Logger","Sending Data Here"); 
        sec = 0; 
       } 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       ll.isActive=false; 
       Log.d("GPS-Logged","EXIT Request Received"); 
      } 
     } 
    } 

Я знаю, что я попросил несколько выше вопросы, но я не знал, как отделить их. НУЖНА ПОМОЩЬ !!!

+0

общественности статической строки FormattedResult; // сделать его статическим Тогда в вас класс службы доступа строку как LocationFetcher.FormattedResult. –

+2

locationFetcher.FormattedResult –

+0

Забудьте «статические» рекомендации, они опасны, если вы не понимаете, что делаете. @HoanNguyen прав. Кстати, не используйте таймеры на Android, 'post()' 'Runnable' через 'Handler' или 'View' функции удобства вместо этого. «Таймер» - это отдельный «поток», который очень неэффективен для Android. –

ответ

0

Вы можете иметь местоположение сборщика модифицированный как «LocationListenerClass» показано ниже:

Основная проблема, чтобы увидеть в модифицированном классе является следующим:

1.I использовал одноэлементный класс для регистрации и удаление обновлений местоположения из общей области (например, наш сервис и т. д.).

2. Вы должны инициализировать строку местоположения say (FormattedResult как в вашем случае) как из onLocationChngaed(), так и getCurrentLocation(). Потому что onLocationChngaed() будет вызывать только при изменении расстояния и времени, как указано в requestLocationUpdates, об этом подробнее.

public class LocationListenerClass implements LocationListener{ 
     private static LocationListenerClass instance; 
     private static Context context; 
     private LocationManager myLocationManager; 
     private LocationListener myLocationListener; 
     private Double latitude = 0d; 
     private Double longitude = 0d; 
public static String FormattedResult; 
     public static LocationListenerClass getInstance(Context context) { 
      LocationListenerClass.context = context; 
      if (null == instance) { 
       instance = new LocationListenerClass(); 
      } 
      return instance; 
     } 

     public void getCurrentLocation() { 
      try { 
       myLocationManager = (LocationManager) context 
         .getSystemService(Context.LOCATION_SERVICE); 

       myLocationManager.requestLocationUpdates(
         LocationManager.GPS_PROVIDER, 30000, 100, 
         this); 

       Location location; 
       location = myLocationManager 
         .getLastKnownLocation(LocationManager.GPS_PROVIDER); 

       if (location == null) { 
        myLocationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 30000, 100, 
          myLocationListener); 
        location = myLocationManager 
          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
       } 

       if (location != null) { 
        try { 
         latitude = location.getLatitude(); 
         Data.CURENT_LATITUDE = latitude; 
         Log.v(ConstantLib.LOG, " latitude : " 
           + Data.CURENT_LATITUDE); 
         longitude = location.getLongitude(); 
         Data.CURENT_LONGITUDE = longitude; 
         Log.v(ConstantLib.LOG, " longitude : " 
           + Data.CURENT_LONGITUDE); 

**FormattedResult=String.format(Locale.ENGLISH, "Lat=\t%f\nLong=\t%f", latitude(),longitude()); 
     Log.d("LocationFetcher",this.FormattedResult);** 

        } catch (Exception e) { 
e.printStackTrace(); 
        } 

       } 
      } catch (Exception e) { 
e.printStackTrace(); 
      } 

     } 

     public void removeLocationUpdates() { 
      try { 
       if (myLocationManager != null) { 
        myLocationManager.removeUpdates(myLocationListener); 
       } 
      } catch (Exception e) { 
      } 
     } 



      public void onLocationChanged(Location location) { 

       try { 
        if (location != null) { 
         Data.CURENT_LATITUDE = location.getLatitude(); 
         Log.v(ConstantLib.LOG, "LOCATION CHANGED" + " latitude : " 
           + Data.CURENT_LATITUDE); 
         longitude = location.getLongitude(); 
         Data.CURENT_LONGITUDE = location.getLongitude(); 
         Log.v(ConstantLib.LOG, "LOCATION CHANGED" + " longitude : " 
           + Data.CURENT_LONGITUDE); 

**FormattedResult=String.format(Locale.ENGLISH, "Lat=\t%f\nLong=\t%f", latitude(),longitude()); 
     Log.d("LocationFetcher",this.FormattedResult);** 
        } 
       } catch (Exception e) { 
    e.printStackTrace(); 
       } 

      } 

      public void onProviderDisabled(String provider) { 
       // TODO Auto-generated method stub 

      } 

      public void onProviderEnabled(String provider) { 
       // TODO Auto-generated method stub 

      } 

      public void onStatusChanged(String provider, int status, Bundle extras) { 
       // TODO Auto-generated method stub 
      } 
     } 
Смежные вопросы