我在我的应用程序中使用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);
}
}
}
}
}
非常感谢任何帮助
答案 0 :(得分:2)
您的基本问题是您在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
为false,则_isRunning
(这使您可以在停止计时器后忽略任何待处理的run()
调用)。< / p>