2016-04-03 15 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

質問が分かりましたら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(); 
      } 
     } 
    } 
}; 

は今、あなただけRunnableを停止するstopTimer()を呼び出す必要があります。

もう1つの方法は、RunnableInterruptedExceptionを処理し、メインプログラムから割り込みを送信することです。

関連する問題