连续运行功能改变TextView

时间:2018-02-02 00:01:05

标签: java android

我的启动画面上有TextView,我试图模仿Discord的随机加载文字。

我有以下代码,来自here

    private void LoadText() {

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            final TextView loadingTextView = findViewById(R.id.loading);
            loadingTextView.setText(FetchRandomLoadingText());
        }
    };


    ScheduledExecutorService ex = Executors.newScheduledThreadPool(1);
    ex.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS);

}

FetchRandomLoadingText()返回ArrayList索引中的字符串,工作正常(使用Toast测试,以确保它不是问题)。

这适用于一个或两个更新,但如果启动需要更长时间(例如网络连接速度慢)来执行此操作,则文本会在 2次迭代后停止更新

我已经在JavaScript for Java中查看了等效的setInterval,但解决方案似乎迭代一次,然后一起停止。

在我标记要加载的新活动之前,我是否遗漏了一些明显无法运行的内容?

2 个答案:

答案 0 :(得分:2)

我会使用处理程序而不是调度程序。

long delay = 5000; //5 seconds
final TextView loadingTextView = findViewById(R.id.loading);
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        loadingTextView.setText(FetchRandomLoadingText());
        handler.postDelayed(this, delay);
    }
};
handler.post(runnable);

我还会测试以确保FetchRandomLoadingText()像您期望的那样运行。也许运行20次并将结果打印成虚拟活动

答案 1 :(得分:0)

安德鲁的代码是我在制作中使用的代码,但略有改动。我在执行期间对代码进行了一些分析,并注意到如果我的启动画面没有改变到主要活动(当我发现错误时的设计),会有轻微的内存泄漏。我错误地将上面的代码运行了大约20分钟,发现该应用程序开始运行10 mb以上TextView的简单活动应该是现实的。

更改后的内存泄漏代码应该在类级别声明handlerrunnable并在onCreate函数中实例化,而不是在本地执行块内部实例化。这样做不仅可以防止内存泄漏,还可以更快地执行。