2016-04-03 54 views
-1

我想制作一个定时器应用程序,在特定的时间过后发出警报。我是Android开发新手,所以我拿起了一个来自互联网的示例计时器代码,并试图根据我的需要对其进行修改。如何在特定条件下停止可运行计时器?

我已经完成了1分钟过后定时器发出警报的部分,但警报声并未停止,我该怎么做。下面

我的代码给出:

package com.example.aditya.timerapp; 

import android.media.Ringtone; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.common.api.GoogleApiClient; 

public class MainActivity extends AppCompatActivity { 

private ProgressBar progress; 
private TextView timerValue; 
private long startTime = 0L; 
private Handler customHandler = new Handler(); 
long timeInMilliseconds = 0L; 
long timeSwapBuff = 0L; 
long updatedTime = 0L; 
int progressStatus = 0; 
private boolean stopped = false; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    //final CountDown timer = new CountDown(); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    timerValue = (TextView) findViewById(R.id.timerVal); 
    Button startButton = (Button) findViewById(R.id.startButton); 
    startButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      //timer.start(); 
      startTime = SystemClock.uptimeMillis(); 
      customHandler.postDelayed(updateTimerThread, 0); 

     } 
    }); 
    Button pauseButton = (Button) findViewById(R.id.stopButton); 
    pauseButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      /*try { 
       timer.wait(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      }*/ 
      timeSwapBuff += timeInMilliseconds; 
      customHandler.removeCallbacks(updateTimerThread); 
     } 
    }); 
    Button resetButton = (Button) findViewById(R.id.resetButton); 
    resetButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      //timeSwapBuff += timeInMilliseconds; 
      timeInMilliseconds = 0L; 
      timeSwapBuff = 0L; 
      updatedTime = 0L; 
      int secs = (int) (updatedTime/1000); 
      int mins = secs/60; 
      secs = secs % 60; 
      int milliseconds = (int) (updatedTime % 1000); 
      timerValue.setText("" + mins + ":" 
        + String.format("%02d", secs) + ":" 
        + String.format("%03d", milliseconds)); 
      customHandler.removeCallbacks(updateTimerThread); 
      onStop(); 

     } 
    }); 
    progress = (ProgressBar) findViewById(R.id.progressBar); 
} 

/*public void stopRun() { 
    //if (updatedTime == 0) { 
    //Toast.makeText(new MainActivity(), "StopRun",Toast.LENGTH_LONG).show(); 
    timeSwapBuff = 0; 
    timerValue.setText("00:00:000"); 
    //updateTimerThread. 
    customHandler.removeCallbacks(updateTimerThread); 
    //} 
}*/ 

private Runnable updateTimerThread = new Runnable() { 
    @Override 
    public void run() { 
     //long totalMilliseconds = 1500000; 
     //while (!stopped){ 
     //long totalMilliseconds = 15000; 
     //updatedTime = totalMilliseconds - SystemClock.currentThreadTimeMillis(); 
     timeInMilliseconds = SystemClock.uptimeMillis() - startTime; 
     updatedTime = timeSwapBuff + timeInMilliseconds; 

     int secs = (int) (updatedTime/1000); 
     int mins = secs/60; 
     secs = secs % 60; 
     int milliseconds = (int) (updatedTime % 1000); 
     timerValue.setText("" + mins + ":" 
       + String.format("%02d", secs) + ":" 
       + String.format("%03d", milliseconds)); 
     customHandler.postDelayed(this, 0); 

     if (mins == 1 && secs == 0) { 
      playTimer(); 
     } 
    } 
}; 

public ProgressBar getProgress() { 
    return progress; 
} 

public void setProgress(ProgressBar progress) { 
    this.progress = progress; 
} 
public void playTimer(){ 
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
    Ringtone ring = RingtoneManager.getRingtone(getApplicationContext(), notification); 
    ring.play(); 
    timeSwapBuff += timeInMilliseconds; 
    customHandler.removeCallbacks(updateTimerThread); 

} 
protected void onStop() { 
    customHandler.removeCallbacks(updateTimerThread); 
    super.onStop(); 
} 
} 

所以现在我需要一种方法,当用户按下复位键停止报警。请建议。

回答

0

如果我理解了正确的问题,您可以尝试通过在onStop()方法中声明private Ringtone ring和拨打ring.stop()方法来停止警报声。

private Ringtone ring; //...// public void playTimer(){ Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); ring = RingtoneManager.getRingtone(getApplicationContext(), notification); ring.play(); timeSwapBuff += timeInMilliseconds; customHandler.removeCallbacks(updateTimerThread); } protected void onStop() { customHandler.removeCallbacks(updateTimerThread); ring.stop(); super.onStop(); }

1

一种方式做到这一点如下:

  1. 定义您Runnable内布尔和run()做任何事情之前检查。

  2. 使用Runnable中的方法翻转它。

这里是代码片段:

private Runnable updateTimerThread = new Runnable() { 
    private volatile boolean flag = true; 

    public void stopTimer() { 
     this.flag = false; 
    } 

    @Override 
    public void run() { 
     while(flag) { 
      //long totalMilliseconds = 1500000; 
      //while (!stopped){ 
      //long totalMilliseconds = 15000; 
      //updatedTime = totalMilliseconds - SystemClock.currentThreadTimeMillis(); 
      timeInMilliseconds = SystemClock.uptimeMillis() - startTime; 
      updatedTime = timeSwapBuff + timeInMilliseconds; 

      int secs = (int) (updatedTime/1000); 
      int mins = secs/60; 
      secs = secs % 60; 
      int milliseconds = (int) (updatedTime % 1000); 
      timerValue.setText("" + mins + ":" 
       + String.format("%02d", secs) + ":" 
       + String.format("%03d", milliseconds)); 
      customHandler.postDelayed(this, 0); 

      if (mins == 1 && secs == 0) { 
       playTimer(); 
      } 
     } 
    } 
}; 

现在,你只需要调用stopTimer()停止Runnable

另一种方法是处理Runnable中的InterruptedException并从主程序发送一个中断。

相关问题