java - handler.postDelayed 无法正常工作
问题描述
我有一个简单的秒表代码片段。线程在自定义类中运行,它通过接口连接到主活动
public class MainActivity extends AppCompatActivity implements MainActivityInteractionInterface{
public static boolean isRunning = false;
Stopwatch stopWatch;
private TextView textViewMilliSeconds;
private TextView textViewSeconds;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewMilliSeconds = findViewById(R.id.textViewStopwatchMilliseconds);
textViewSeconds = findViewById(R.id.textViewStopwatchSeconds);
stopWatch = new Stopwatch(this, getApplicationContext());
stopWatch.runThread();
}
@Override
public void updateUI() {
String time = String.format(Locale.getDefault(), "%03d", stopWatch.getMilliseconds());
textViewMilliSeconds.setText(time);
String timeSeconds = String.format(Locale.getDefault(), "%02d", stopWatch.getSeconds());
textViewSeconds.setText(timeSeconds);
}
public void startTimer(View view) {
isRunning = !isRunning;
}
public class Stopwatch {
private int milliseconds = 0;
private int seconds = 0;
public int getMilliseconds() {
return milliseconds;
}
public int getSeconds() {
return seconds;
}
private MainActivityInteractionInterface interactionInterface;
private Context applicationContext;
public Stopwatch(MainActivityInteractionInterface interactionInterface, Context applicationContext){
this.interactionInterface = interactionInterface;
this.applicationContext = applicationContext;
}
public void runThread(){
final Handler handler = new Handler();
handler.post(new Runnable(){
@Override
public void run(){
if(isRunning) {
milliseconds++;
if (milliseconds == 1000) {
milliseconds = 0;
seconds++;
if(seconds == 60){
seconds = 0;
}
}
}
interactionInterface.updateUI();
handler.postDelayed(this, 1);
}
});
}
处理程序应该每 1 毫秒更新一次,当有 1000 毫秒时,经过 1 秒如果我设置 handler.postDelayed 延迟,任何低于 15 的时间达到 1000 毫秒都需要 18 秒,为什么?
解决方案
我不知道为什么最多需要 18 秒,但我可以告诉你:Android 每 16 毫秒刷新一次 UI(以达到 60 fps 的速率),因此在更短的时间内将处理程序设置为updateUI是没有意义的,并且也许也干扰它。
以我的拙见,让它在 20 毫秒内更新并相应地更改计数器值,如下所示:
handler.post(new Runnable(){
@Override
public void run(){
if(isRunning) {
milliseconds++;
if (milliseconds == 50) {
milliseconds = 0;
seconds++;
if(seconds == 60){
seconds = 0;
}
}
}
interactionInterface.updateUI();
handler.postDelayed(this, 20);
}
});
推荐阅读
- java - 如何将 export JAVA_HOME=$(/usr/bin/java) 添加到 .bashrc?
- android - 文本字符串必须在
零件。(在 android 和 ios 上...在 expo 中运行) - c++ - 我收到警告控制到达非无效函数的结尾
- svg - html 画布剪辑,但带有图像
- github - 如何实现 Github 组织和存储库策略即代码/基础架构即代码?
- python - 有没有更好的方法来处理 NaN 值?
- c++ - 查找两个二叉搜索树的交集
- python - 在 PyCharm 中为 python 项目添加运行配置
- database - Knex(postres) - 有没有办法让列仅在某些情况下是唯一的
- python - 带打印的 Python 类型转换