gpt4 book ai didi

java - Android studio Java 循环更新文本

转载 作者:太空狗 更新时间:2023-10-29 13:13:34 27 4
gpt4 key购买 nike

第一次在这里学习编码语言..我在 Java 的很多地方都在挣扎,但我正在慢慢学习。

我正在制作一个应用程序,必须显示动态更新的文本。所以下面的代码是我的尝试,它工作得很好(有点)。问题是当程序运行 for 循环时它不会更新屏幕。

因此,当我从主要 Activity 中按下按钮时,它会运行一个名为播放的 Activity 。它有 14 个 0 的文本字段,应该自动将它们一一更新为 7。

但是运行下面的代码后,片刻之后只显示了十四个7。 (也没有 0 开头!)显示屏幕的任何代码,以便我可以将其放在 setText() 下?

如果之前有人问过这个问题,我很抱歉,但我真的无法在网上找到任何答案。

public class Play extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_play);
Initialization();
}

public void Initialization() {
TextView[] textViews = new TextView[] {
(TextView)findViewById(R.id.player1_1),
(TextView)findViewById(R.id.player1_2),
(TextView)findViewById(R.id.player1_3),
(TextView)findViewById(R.id.player1_4),
(TextView)findViewById(R.id.player1_5),
(TextView)findViewById(R.id.player1_6),
(TextView)findViewById(R.id.player1_7),

(TextView)findViewById(R.id.player2_1),
(TextView)findViewById(R.id.player2_2),
(TextView)findViewById(R.id.player2_3),
(TextView)findViewById(R.id.player2_4),
(TextView)findViewById(R.id.player2_5),
(TextView)findViewById(R.id.player2_6),
(TextView)findViewById(R.id.player2_7)
};
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 14; j++) {
textViews[j].setText(Integer.toString(i));
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}

最佳答案

目前,您在 UI 线程上调用 Thread.sleep(25)。这意味着 UI 线程将被阻塞并且不会更新您的 TextView 。在所有阻塞之后,它最终在 for 循环后解除阻塞,因此您可以立即看到所有文本字段都在更新。

为了更好的用户体验,永远不要让 UI 线程 hibernate 。

您需要能够在一段时间后完成一些工作的东西。 android.os.Handler 是一个不错的选择。它有一个 postDelayed 方法,可以在一段时间后执行您希望它执行的操作。

IMO,直接调用 postDelayed 确实可以完成您的工作。但是每个 postDelayed 调用都包含另一个调用,以便在几秒后更新下一个 TextView 。这意味着您最终会得到 14 层嵌套!这不是很干净的代码,是吗?

那么,让我介绍一下Timer类吧!

这里是:

import android.os.Handler;

public class Timer {
private Handler handler;
private boolean paused;

private int interval;

private Runnable task = new Runnable () {
@Override
public void run() {
if (!paused) {
runnable.run ();
Timer.this.handler.postDelayed (this, interval);
}
}
};

private Runnable runnable;

public int getInterval() {
return interval;
}

public void setInterval(int interval) {
this.interval = interval;
}

public void startTimer () {
paused = false;
handler.postDelayed (task, interval);
}

public void stopTimer () {
paused = true;
}

public Timer (Runnable runnable, int interval, boolean started) {
handler = new Handler ();
this.runnable = runnable;
this.interval = interval;
if (started)
startTimer ();
}
}

这东西很酷。

为了满足要求,让我们在您的 Activity 类中添加一个计数器textViewToUpdate,以便我们知道它是什么数字以及接下来要更新哪个 TextView 。哦,将 textViews 变量移动到类级别:

int counter = 1;
int textViewToUpdate = 0;

TextView[] textViews;

并在onCreate中初始化textViews:

textViews = new TextView[] {
(TextView)findViewById(R.id.player1_1),
(TextView)findViewById(R.id.player1_2),
(TextView)findViewById(R.id.player1_3),
(TextView)findViewById(R.id.player1_4),
(TextView)findViewById(R.id.player1_5),
(TextView)findViewById(R.id.player1_6),
(TextView)findViewById(R.id.player1_7),

(TextView)findViewById(R.id.player2_1),
(TextView)findViewById(R.id.player2_2),
(TextView)findViewById(R.id.player2_3),
(TextView)findViewById(R.id.player2_4),
(TextView)findViewById(R.id.player2_5),
(TextView)findViewById(R.id.player2_6),
(TextView)findViewById(R.id.player2_7)
};

首先在你的类中创建一个计时器:

Timer t;

在您的Initialization 方法中,创建一个runnable。这个 runnable 将每隔几秒运行一次。

Runnable r = new Runnable () {
@Override
public void run() {
PlayActivity self = PlayActivity.this;
self.textViews[self.textViewToUpdate].setText(Integer.toString(self.counter));
self.textViewToUpdate++;
if (self.textViewToUpdate == self.textViews.length) {
self.textViewToUpdate = 0;
self.counter++;
if (self.counter == 8) {
self.t.stopTimer();
}
}
}
}

然后,我们创建计时器并运行它:

t = new Timer(r, interval, true);

您可以将 interval 替换为您喜欢的任何数字,例如 250(0.25 秒)?

砰!你做到了!

关于java - Android studio Java 循环更新文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37357686/

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