我使用的是CountDownTimer
,但它似乎无法正常工作。我需要抓住速度;如果它超过一定的速度,什么都不做..我只是记录速度。但如果速度达到一定速度,我需要在三分钟倒数计时器后发出通知。
有人可以查看我的代码,看看我做错了什么吗?如果速度超过了它,那很好..它没有运行计时器,但问题是当它达到一定的速度时。有时计时器工作,有时候,没有。有时它只记录0并且不显示计时器。
我知道条件,我一遍又一遍地看着它,我看不出可能出错的地方。四只眼睛比两只眼睛好?
感谢任何帮助。感谢。
public class SpeedManagerService extends Service implements IBaseGpsListener {
private static final String TAG = "SpeedCheckerService";
public boolean vehicleStopped = false;
public boolean timer_started = true;
float nCurrentSpeed = 0;
CountDownTimer timer = new CountDownTimer( 180000, 1000 ) {
// If speed increases again, cancel timer.
public void onTick(long millisUntilFinished) {
Log.i( "Current Ride", "Timer countdown: " + millisUntilFinished / 1000 +
" seconds." );
if (vehicleStopped) {
// Vehicle should have stopped, but it has started moving again
if (nCurrentSpeed > 0) {
timer.cancel();
timer_started = false;
}
} else if (nCurrentSpeed == 0) {
// If vehicle has just slowed down,
// once speed drops to zero we have stopped
vehicleStopped = true;
}
}
public void onFinish() {
Intent resultIntent = new Intent( SpeedManagerService.this, CurrentRide.class );
NotificationCompat.Builder builder = new NotificationCompat
.Builder( SpeedManagerService.this );
builder.setContentText( "Click to save Current Ride info" );
builder.setSmallIcon( R.mipmap.ic_launcher );
builder.setContentTitle( "Did you just pay for a Ride?" );
builder.setContentIntent( PendingIntent.getActivity( SpeedManagerService.this, 0,
resultIntent, 0 ) );
NotificationManagerCompat.from( SpeedManagerService.this ).notify( 0,
builder.build() );
timer.start();
}
}
.start();
@Override
public void onCreate() {
Log.i( TAG, "in onCreate()" );
LocationManager locationManager = (LocationManager) this.
getSystemService( Context.LOCATION_SERVICE );
if (ActivityCompat.checkSelfPermission( this, android.Manifest.permission
.ACCESS_FINE_LOCATION )
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( this,
android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager
.PERMISSION_GRANTED) {
return;
}
locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, this );
SpeedManagerService.this.updateSpeed( null );
}
// On start, run speed service, and return sticky so if error, service will restart
// on its own
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand( intent, flags, startId );
Log.i( TAG, "Service onStartCommand" );
if (nCurrentSpeed == 0) {
timer_started = false;
}
updateSpeed( null );
return Service.START_STICKY;
}
public void updateSpeed(SpeedLocation location) {
Log.i( "Current Ride ", "User is in a Vehicle. Speed is: " +
Math.round( nCurrentSpeed ) + " mph. " );
// If a location exists, get speed
if (location != null) {
nCurrentSpeed = location.getSpeed();
}
// In meters/second, if speed goes above 8 mph, then it will just log the
// speed as miles/hour.
if (nCurrentSpeed >= 8) {
}
// However, if speed falls below 5 mph, then countdown timer
// of 3 minutes will begin.
if (nCurrentSpeed <= 5 && !timer_started) {
// Flag to indicate if vehicle has come to a complete stop
vehicleStopped = (nCurrentSpeed == 0);
// Indicate the timer is running
timer_started = true;
timer.start();
}
}
@Override
public void onDestroy() {
timer.cancel();
Log.i( TAG, "Timer cancelled" );
super.onDestroy();
}
// Binder returns null because it's not used
@Override
public IBinder onBind(Intent intent) {
return null;
}
// If location changes, update location and speed.
@Override
public void onLocationChanged(Location location) {
if (location != null) {
SpeedLocation myLocation = new SpeedLocation( location, false );
this.updateSpeed( myLocation );
}
}
// If provider is disabled, timer won't run either
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onGpsStatusChanged(int event) {
}
}
这是我得到的logcat的一部分:
07-05 17:42:17.742 17023-17023/ I/Current Ride:: User is in a Vehicle. Speed is: 3 mph.
07-05 17:42:17.752 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.752 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.762 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
07-05 17:42:17.772 17023-17023/ I/Current Ride: Timer countdown: 179 seconds.
并且在显示下一个里程之前它会做25次。
答案 0 :(得分:1)
根据您的评论判断,您需要制定一种稍微复杂的确定停止方法。在启动计时器时,这样的事情可能是有序的:
if (nCurrentSpeed <= 5 && !timerStarted) {
// Flag to indicate if vehicle has come to a complete stop
vehicleStopped = (nCurrentSpeed == 0);
// Indicate the timer is running
timerStarted = true;
timer.start();
}
然后每个嘀嗒声:
public void onTick(long millisUntilFinished) {
Log.i( "Current Ride", "Timer countdown: " + millisUntilFinished / 1000 +
" seconds." );
if (vehicleStopped)
{
// Vehicle should have stopped, but it has started moving again
if (nCurrentSpeed > 0)
{
timer.cancel();
timerStarted = false;
}
}
else if (nCurrentSpeed == 0)
{
// If vehicle has just slowed down,
// once speed drops to zero we have stopped
vehicleStopped = true;
}
}
以上似乎符合您的要求。