当前位置: 首页 > 面试题库 >

Android Studio Java更新循环中的文本

齐驰
2023-03-14
问题内容

第一次在这里学习编码语言。.我在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 ();
    }
}

这东西很酷。

为了满足要求,让我们在活动类中添加countertextViewToUpdate,以便我们知道它的编号以及接下来要更新的文本视图。哦,将textViews变量移到类级别:

int counter = 1;
int textViewToUpdate = 0;

TextView[] textViews;

然后初始化textViewsin 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