gpt4 book ai didi

java - 不显示定期更新的文本

转载 作者:行者123 更新时间:2023-11-29 19:23:13 25 4
gpt4 key购买 nike

我有一个 for 循环,我想在其中调用 setText 方法。除了在脚本运行完成之前文本不会更改之外,这没有任何错误。我希望它做的是在每次调用 setText 方法时更改代码。我在下面附上了我的代码,它应该非常简单。代码:

package com.example.zoe.andone;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startLoop(View view) {
String string = getString(R.string.hello);
((TextView)findViewById(R.id.hello)).setText("starting...");
for (int i = 0; i < 10; i++) {
String updated = Integer.toString(i);
((TextView)findViewById(R.id.hello)).setText(updated);
try {
Thread.sleep(250);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
((TextView)findViewById(R.id.hello)).setText("done!");
}
}

最佳答案

这就是所谓的“丢帧”。

是时候学习了!

在回答之前,让我们解释一下这里发生了什么。

您可能已经知道 android 的帧速率为 60fps(每秒 60 帧),这意味着每 1/60 秒就会向用户渲染和显示屏幕(以提供最佳清晰度)。它通过每 1/60 秒在您的应用程序(以及其他任何需要渲染的地方)上运行一些渲染代码来计算显示的屏幕在这个特定的 ms 应该是什么样子(它被称为帧)来做到这一点。

但是,执行此操作的代码是在 UI 线程上运行的,如果您在渲染节拍开始时正在执行任何操作,android 框架只会丢弃该帧(它不会计算它)。在你的情况下 Thread.sleep(250); 是导致你的帧被丢弃的原因,因为它在你的 for 循环的每次迭代中保持 UI 线程 250 毫秒(所以它是 250 毫秒 * (10 - 1), 那是很多帧)。

丢帧意味着在 UI 上看不到任何更新。

解决方案

不要使用 Thread.sleep(250); 和丢帧,您应该安排更新任务每 250 毫秒运行一次。就是这样。

private int i = 0; // Does the trick!
public void startLoop(View view) {
String string = getString(R.string.hello);
((TextView)findViewById(R.id.hello)).setText("starting...");
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (i < 10) {
String updated = Integer.toString(i);
i++;
updateHelloOnUiThread(updated);
} else {
updateHelloOnUiThread("done!");
handler.removeCallbacksAndMessages(null);
i = 0; // For future usages
}
}
},250);
}

private void updateHelloOnUiThread(final String text) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
((TextView)findViewById(R.id.hello)).setText(text);
}
});
}

进一步阅读

Android UI : Fixing skipped frames

High Performance Android Apps, Chapter 4. Screen and UI Performance

关于java - 不显示定期更新的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41948487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com