Java / Androidには、ある時間間隔でクラス内のメソッドを実行するために使用できる構造がありますか?
私はScheduler
とTimer
クラスを知っていますが、別のクラスをインスタンス化することは避ける必要があります。メソッドは別のスレッドで実行してはなりません。AsyncTask
またはを実行するHandler
と、別のスレッドになります。
メソッドは別の別のスレッドで実行してはなりません
この要件のため、合理的な解決策は 1 つしかありません。次のように、独自のスレッドで待機する必要があります。
for (int i = 0; i < 100; i++) {
long intervalInMs = 1000; // run every second
long nextRun = System.currentTimeMillis() + intervalInMs;
callAMethod();
if (nextRun > System.currentTimeMillis()) {
Thread.sleep(nextRun - System.currentTimeMillis());
}
}
メソッド呼び出しに待機するよりも長い時間がかかる場合、2 回呼び出されることはありません ( が 1 つしかないためThread
)に注意してください。else
if
intervalInMs
リスナーを受け取るカスタム タイマーを作成し、時間が経過したら、スレッドでタイマーを作成したオブジェクトにコールバックを送信します。
これにより、タイマー用の新しいスレッドが作成されますが、実行するメソッドは元のオブジェクト スレッドで実行されます。
これには AlarmManager を使用する必要があります。
概要については、この SO を確認してください: Android: How to use AlarmManager
私はあなた自身のスレッド内でこれを管理しようとはしませんが、Android フレームワークにこれを処理させてください。同じスレッドで実行する必要がある理由がわかりません。
ブロックせずに同じスレッドでこれを行う必要がある場合、考えられる解決策の 1 つは、ある種のポーリングを行うことです。メソッドが最後に起動してから経過した時間を定期的に計算するコードを想像します。構成された期間が経過した場合は、メソッドを再度起動します。
この種のソリューションは、実装が複雑に思えます。ポーリング コードをどのくらいの頻度で実行しますか? その間も実行し続ける可能性が高いアプリの残りの部分のロジック内で、ポーリング コードをどのように実行しますか? これらは、すぐに頭に浮かぶ技術的な課題にすぎません。他にもいると思います。これを念頭に置いて、より良い解決策は制限を再考することだと思います. なんで同じスレでやりたいの?理由をよく考えて、別のスレッドを使用することを検討する必要があります (Timer で自分でロールするか、Android プラットフォームを使用して AlarmManager で管理するか)。