以下に、Runnable「アップデーター」...および、Handler.PostDelayed関数を使用して遅延後にrunnableを実行するOnClick関数があります...
少し編集した後、不要な部分を切り取ったのが機能です: (passtog = Toggle Button)
final Runnable updater = new Runnable() {
@Override
public void run() {
if (passTog.isChecked()) {
now = System.currentTimeMillis();
time = now - init;
if (time > 5000) {
Toast.makeText(getApplicationContext(), "WAKE UP !",
Toast.LENGTH_SHORT).show();
}
handler.postDelayed(this, 25);
}
}
};
passTog.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
init = System.currentTimeMillis();
flag = true;
handler.postDelayed(updater,
(new Random().nextInt(4000) + 3000));
}
});
}
説明 基本的に、ユーザーはトグル ボタンをトグルします。オンになりました: ランナブルは完全に実行できます (すべてが if ブロックにあります)。ユーザーがもう一度ボタンを押さず、スイッチをオフにすると、アプリはトースト「Wake Up!」を送信します。..25ミリ秒ごとに実行およびチェックして時間を更新します...
かなり簡単です...しかし、私は問題を抱えています。
プログラムが実際にランナブルに到達する前に、少なくとも 3 秒の時間遅延 + ランダム値が必要です。したがって、3 秒から 7 秒の間で変化します。3-7 の間で変化する必要がありますが、そうではありません。
私がそれを実行すると:問題 は、初めて、それがうまく機能することに気づきました...私は少なくとも3秒の遅延+ランダム値=パーフェクトを取得します
2回目は、スイッチがオンになった後です->オフ->オン:+3000が表示されないように動作します...そして〜randInt(4000)関数だけです...したがって、0を返す可能性があります秒または4秒の遅延が発生する可能性があります...
私のすべての経験で、私は実際にこれに出くわしたことはありません..コード全体を書き直しました.私の他のアプリはまったく同じ構文でこの関数を使用し、かなりうまくいくようです..なぜこれが問題を引き起こしているのですか? トーストの時間が問題を引き起こしている可能性があります..
これを解決するには?(私は他の方法を受け入れていますが、できれば迅速に実装できます。何らかの理由で得られない最小3秒の遅延が必要です... UIが応答する必要がありますが、スレッドはスリープしていません。)