2017-01-16 1 views
0

stopService не убивает TimerTask, таймер по-прежнему работает каждые 10 секунд на фоне, хотя LiveTrackingService остановлен.Как убить TimerTask реализует LocationListener?

Intent intent = new Intent(getActivity().getApplicationContext(), LiveTrackingService.class); 
getActivity().stopService(intent); 

Вот LiveTrackingService: (Я хотел бы получить обновление данных местоположения каждый 10SEC до пользователь прекращает обслуживание.)

public class LiveTrackingService extends Service { 

    final Handler mHandler = new Handler(); 
    private Timer mTimer = new Timer(); 
    protected LocationManager locationManager; 

    public static final long NOTIFY_INTERVAL = 10 * 1000; 

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

    @Override 
    public void onCreate() { 
     //schedule task 
     startService(); 
    } 


    private void startService() 
    { 
     mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL); 
    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mTimer.cancel(); 
     mTimer.purge(); 
     mTimer=null; 
     mHandler.removeCallbacksAndMessages(null); 
     Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); 

    } 


    private class TimeDisplayTimerTask extends TimerTask implements LocationListener { 

     @Override 
     public void run() { 

       mHandler.post(new Runnable() { 

        @Override 
        public void run() { 
         if(checkLocationPermission()) { 
          locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000, 0, TimeDisplayTimerTask.this); 

         } 
        } 
       }); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      // I get location and do work here 

      if (location != null) { 
       Log.d("onLocationChanged", "onLocationChanged"); 
      } 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 

     } 

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

     } 

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

     } 

    } 

ответ

1

Держите экземпляр TimeDisplayTimerTask в классе обслуживания, а затем использовать его, чтобы удалить обновления местоположения в onDestroy().

public class LiveTrackingService extends Service { 

    private TimeDisplayTimerTask mTask; 

    @Override 
    public void onCreate() { 
     mTask = new TimeDisplayTimerTask(); 
    } 

    private void startService() { 
     mTimer.scheduleAtFixedRate(mTask, 0, NOTIFY_INTERVAL); 
    } 

    @Override 
    public void onDestroy() { 
     // Remove location updates. 
     locationManager.removeUpdates(mTask); 
    } 
} 
+1

OnDestroy(), как говорят, не то, что надежность. Во всяком случае, это кажется жизнеспособным способом сделать это. Причина, по которой TimerTask не убивается, может быть, тот факт, что ее запуск в ThreadPool сам по себе и служба находится в потоке пользовательского интерфейса. После того, как таймер будет развернут, служба может не иметь контроля над ним. –

+0

Это не сработало, и задача Таймера все еще работает. – arlen

0
public class LiveTrackingService extends Service { 

    final Handler mHandler = new Handler(); 

    private LocationManager locationManager; 
    private TimeDisplayTimerTask mTimerTask=new TimeDisplayTimerTask(); 
    private Timer mTimer = new Timer(); 

    public static final long NOTIFY_INTERVAL = 10 * 1000; 

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

    @Override 
    public void onCreate() { 
     startService(); 
    } 


    private void startService() 
    { 
     mTimer.scheduleAtFixedRate(mTimerTask, 0, NOTIFY_INTERVAL); 
    } 



    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mTimer.cancel(); 
     mTimer.purge(); 
     mTimer=null; 
     mHandler.removeCallbacksAndMessages(null); 

     // Remove location updates. 
     if(checkLocationPermission()) { 
      locationManager.removeUpdates(mTimerTask); 
     } 

     mTimerTask.cancel(); 
     mTimerTask=null; 

     Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); 

    } 


    class TimeDisplayTimerTask extends TimerTask implements LocationListener { 

     @Override 
     public void run() { 

       mHandler.post(new Runnable() { 

        @Override 
        public void run() { 

         if(checkLocationPermission()) { 
          locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000, 0, mTimerTask); 

         } 
        } 
       }); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      // I get location and do work here 

      if (location != null) { 
       Log.d("onLocationChanged", "onLocationChanged"); 
      } 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 

     } 

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

     } 

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

     } 

    } 
+0

Вы решили свою проблему? – nandsito

Смежные вопросы