第一次在这里学习编码语言。.我在Java的许多部分中苦苦挣扎,但是我正在慢慢学习。
我正在制作一个应用程序,不得不显示动态更新的文本。所以下面的代码是我的尝试,它工作得很好(有点)。问题是在程序运行for循环时它不会更新屏幕。
因此,当我从主要活动中按下按钮时,它将运行一个名为“播放”的活动。它有14个文本字段,为0,应将它们自动更新为7。
但是,在运行下面的代码后,稍后显示14个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();
}
}
}
}
}
当前,您调用Thread.sleep(25)
UI线程。这意味着UI线程将被阻止,并且不会更新您的文本视图。经过所有这些阻止之后,它最终会在for循环之后被取消阻止,因此您可以立即查看所有文本字段的更新。
为了获得更好的用户体验,请 不要让UI线程进入睡眠状态。
您需要一些可以在一段时间后完成一些工作的东西。android.os.Handler
是一个不错的选择。它具有一种postDelayed
可以在一段时间后完成您想做的事情的方法。
IMO,直接致电postDelayed
确实可以完成您的工作。但是每个postDelayed
调用都包含另一个,以便在几秒钟后更新下一个文本视图。这意味着您将获得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 ();
}
}
这东西很酷。
为了满足要求,让我们在活动类中添加counter
和textViewToUpdate
,以便我们知道它的编号以及接下来要更新的文本视图。哦,将textViews
变量移到类级别:
int counter = 1;
int textViewToUpdate = 0;
TextView[] textViews;
然后初始化textViews
in onCreate
:
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 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秒)?
还有BOOM!你做到了!
问题内容: 我程序的想法是从以前保存在其他JFrame中的列表中选择一个名称。我想在标签中一个接一个地打印所有名称,它们之间的间隔很小,然后停在其中一个名称上。问题是,如果有多个代码,则无法正常工作。 这是我的代码的一部分: 问题答案: 不要使用循环或。只需使用即可。以下将导致每1000毫秒发生30 次迭代 。您可以相应地调整代码,使其适应每隔毫秒发生一次的情况。 如果需要,您可以在构造函数中设置
我有一个网络应用编程接口,多个列表,和一个从网络应用编程接口查询数据的函数。我已经设法手动更新列表,一次一个。然而,数据有多个列(列表将包含列的数据),并且有38个列表并手动调用函数来更新它们是很麻烦的。我设计了一个简短的for循环来迭代列表,并相应地更新它们。但是,更新后的列表不会返回;或者甚至没有更新。如何在代码中修复此问题?请参阅下面的代码,虽然我不能提供API上的数据: =========
下面的代码尝试迭代excel文件,并将数据加载到
问题内容: 我遇到了一个问题,在这里我想使用GUI从python程序运行几个命令行功能。我不知道我的问题是否特定于 PyQt4, 或者是否与我对Python代码的错误使用有关。 我希望做的是在GUI上有一个标签,以更改其文本值以通知用户正在执行哪个命令。但是,当我使用 for 循环运行多个命令时,就会出现我的问题。我希望标签在每个循环中进行更新,但是,该程序不是在每个循环中更新GUI标签,而是仅在
问题内容: 我在SQL SELECT语句返回的行上有一个循环,并且在对行的数据进行了一些处理之后,有时我想更新该行的值。循环主体中的处理非常重要,我无法用SQL编写。当我尝试为选定的行执行UPDATE时,我得到一个错误(在Perl的DBD :: SQLite :: st执行失败下:数据库表已锁定)。是否有一种可读,高效且可移植的方式来实现我要完成的任务?如果失败,是否有DBD或SQLite特定的方
您可能知道,在正常模式下,当状态更新时,我们使用更新依赖项来获得通知,如下所示: 但在我的例子中,我的状态中有一个数组,我正在尝试在useEffect的循环中更新它,如下所示: 在本例中,每次forEach循环运行时,我都会得到初始val(我知道,因为val不是useffect的依赖项),但如果我将其作为依赖项,它将更新两次。解决这个问题的办法是什么? 编辑:基本上,我的意思是,当我在useffe