2

必要なファイルを 15 分ごとにチェックできる Android サービスを作成したいと考えています。

そのために、TTS を使用してテキストを 10 10 秒ごとに再生するサンプル プログラムを作成しました。また、アラーム マネージャーを使用して 30 秒ごとにサービスを呼び出しました。

サービスは完全に呼び出され、TTS も初めて完全に再生されますが、サービスが 50 秒後に再度呼び出されると、タイマーは 0 から開始されず、代わりに 11、12、13 から開始されます - cancel() を指定したにもかかわらず.

これを解決する方法について誰かが私を助けることができますか?

以下はコードです:

public class ServiceLocation extends Service implements OnInitListener
{

TextToSpeech talker;
Timer t;
public int time = 0;

    @Override
public void onCreate() 
{
    super.onCreate();
    Log.e("Location1", "Inside onCreate");
}

public void onStart(Intent intent, int startId) 
{
    super.onStart(intent, startId);

    t = new Timer();
    Log.e("Location1", "Inside onStart");

    talker = new TextToSpeech(this, this);
    testMethod();
 }

 public void testMethod()
 {      
    //Set the schedule function and rate
    t.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run()    {  

            time += 1;
            String todis = String.valueOf(time);


            if(todis.contains("20"))
            {

                talker.speak("Testing Service in a App",TextToSpeech.QUEUE_ADD,null);

                t.cancel();
                t.purge();
            }
        }   

    }, 0, 1000);
}

  public void onInit(int status) 
  {             
   talker.speak("Testing Service in a App",TextToSpeech.QUEUE_ADD,null);
  }
 }
4

3 に答える 3

1

あなたのonStart()メソッドでは、を初期化してTimer()いますが、タイマーが実行されていることを確認する必要がありますか? 実行中の場合は、キャンセルして新しいタイマーを開始します。サンプルコードは次のとおりです。

public static final long NOTIFY_INTERVAL = YOUR_REQUIRED_INTERVAL_IN_SECODE* 1000;

// run on another Thread to avoid crash
private Handler yourHandler = new Handler();
// timer handling
private Timer yourTimer = null;

@Override
public void onCreate() {
    // cancel if already existed
    if(yourTimer != null) {
        yourTimer.cancel();
    }
        // recreate new
        yourTimer = new Timer();
    
    // schedule task
    yourTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
}

これがあなたTimeDisplayTimerTask()です:

 class TimeDisplayTimerTask extends TimerTask {

    @Override
    public void run() {
        // run on another thread
        yourHandler.post(new Runnable() {

            @Override
            public void run() {
                // display toast
                Toast.makeText(getApplicationContext(), "some message",
                        Toast.LENGTH_SHORT).show();
            }

        });
    }

タイマーをキャンセルするには、これを呼び出すだけです

if(yourTimer != null) {
            yourTimer.cancel();
        }`

ノート:

  1. 固定レート タイマー (scheduleAtFixedRate()) は開始時刻に基づいています (したがって、各反復は startTime + iterationNumber * delayTime で実行されます)。リンクはこちら
  2. スケジュールとタイマー タスクの詳細については、このリンクを参照してください。

ありがとう。下手な英語でごめんなさい。

于 2015-10-17T07:39:19.237 に答える
0

10秒ごとにタイマーをリセットする必要があります。

サンプルコード:

 public void startTimer(){
  t = new Timer();   
  task = new TimerTask() {

    @Override
   public void run() {
    runOnUiThread(new Runnable() {

      @Override
     public void run() {
      TextView tv1 = (TextView) findViewById(R.id.timer);
      tv1.setText(time + "");
      if (time > 0)
       time -= 1;
      else {
       tv1.setText("Welcome");           
      }
     }
    });
   }
  };
  t.scheduleAtFixedRate(task, 0, 1000);
 }

簡単な例については、私のブログ投稿を参照してください。

これがお役に立てば幸いです。

于 2013-04-26T07:29:49.630 に答える
0

TimerTask 復習;

                  timer = new Timer();    
                 refresher = new TimerTask() {
                     public void run() {


                        //your code 

                     };
                 };
                first event immediately,  following after 1 seconds each
                 timer.scheduleAtFixedRate(refresher, 0,1000); 

//所要時間として 1000 を変更できます。1000 は 1 秒に相当します。

このコードをサービス クラス oncreate のように配置できます。コード セクションで 15 分ごとに呼び出したいメソッドを呼び出すことができます。

これがお役に立てば幸いです。

于 2013-04-26T07:14:03.600 に答える