Как отменить TimerTask в BlackBerry - PullRequest
1 голос
/ 18 мая 2011

Я использую TimerTask в своем приложении для обновления текущего GPS на сервере.Я расширил TimerTask и переопределил метод run для этого.У меня есть кнопка остановки на экране, которая должна остановить таймер, как только он будет нажат.но мои проблемы в том, что даже timerobject.cancel() выполняется, но таймер все еще работает.

Может кто-нибудь поделиться своим мнением об остановке таймера при нажатии определенной кнопки.Ниже приведен код, который я написал для запуска задачи таймера.

PointMyLocation.java

public class PointMyLocation 
{
  private String log;
  double longi;
  double lati;
  public String email, city;

  private HttpServiceCommunication mHttpService;

// Default Constructor
public PointMyLocation(int value){
       new LocationTracker(value).StopTimer();
}

public PointMyLocation(String email, String city)
{
    this.email = email;
    this.city = city;
    new LocationTracker();
    //mHttpService = new HttpServiceCommunication();

}
public boolean onClose()
{
    Application.getApplication().requestBackground();
    return false;
}

class LocationTracker extends TimerTask {
 private  double longitude, latitude;

private Timer timer;
private LocationProvider provider;
private BeaconingBean mBb;
int mTimeinterval;
Criteria cr;

public LocationTracker() {
    cr= new Criteria();  
    this.run(); // Calling the run

}

    public void run() {
     timer = new Timer();
     resetGPS();
     //mTimeinterval = mBb.getmTimeInterval();
     //System.out.println("Time Interval :" + mTimeinterval);
     timer.schedule(this, 0, 150000); 
    }

public void StopTimer(){
    // Terminates the timer
    this.timer.cancel();   // Though this statement gets executed, the timer starts   again
}

public void resetGPS()
{
    try 
    {
        provider = LocationProvider.getInstance(cr);
        if(provider != null) 
        {
            provider.setLocationListener(new MyLocationListener(), 3, -1, -1);
        }

    } catch(Exception e){ }
}

private class MyLocationListener implements LocationListener 
{

    public void locationUpdated(LocationProvider provider, Location location)
    {
        if(location != null && location.isValid())
        {               
            QualifiedCoordinates qc = location.getQualifiedCoordinates();
            try 
            {
                lati = location.getQualifiedCoordinates().getLatitude();
                System.out.println("latitude :: "+lati);
                longi = location.getQualifiedCoordinates().getLongitude();
                System.out.println("longitude ::"+longi);
                System.out.println("Email :: " + email);
                System.out.println("City ::" + city);
             } 
            catch(Exception e)
               { 

               }
        }

    }

    public void providerStateChanged(LocationProvider provider, int newState)
    {
        //LocationTracker.this.resetGPS();
         if(newState == LocationProvider.TEMPORARILY_UNAVAILABLE)
            {
                provider.reset();
                provider.setLocationListener(null, 0, 0, -1);
            }
    }
}
} 
}

Любая помощь высоко ценится

1 Ответ

2 голосов
/ 18 мая 2011

Ваша основная проблема заключается в том, что вы перезапускаете таймер в методе run(), чего вам не следует делать. Метод run() вызывается каждый раз, когда таймер «тикает» - здесь вы не хотите изменять и перезапускать свой объект таймера.

Попробуйте это (не проверено, но должно работать). Добавьте метод в ваш класс Timer_Task с именем start:

public void start() {
    timer = new Timer();
    timer.schedule(this, 0, 150000);
}

Измените run() метод на этот:

public void run() {
    resetGPS();
}

Наконец, в конструкторе класса, вызовите this.start() вместо this.run().

Причина, по которой ваш метод остановки, по-видимому, не останавливает таймер, заключается в том, что даже если вы отмените таймер, если есть один ожидающий вызов run(), вызов все равно произойдет, даже если таймер был отменен. Когда этот последний вызов происходит в существующем коде, создается и запускается новый таймер, поэтому весь процесс никогда не останавливается.

Редактировать: Еще одно изменение, которое вы должны сделать, это добавить boolean в ваш класс Timer_Task с именем _isRunning и установить его на true, когда вы запускаете таймер и устанавливаете его на false внутри вашего Stop метода. Затем вы проверите эту переменную внутри метода run(), и return, если _isRunning равно false (это позволяет игнорировать любые ожидающие вызовы run() после остановки таймера).

...