我的启动画面上有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
,但解决方案似乎迭代一次,然后一起停止。
在我标记要加载的新活动之前,我是否遗漏了一些明显无法运行的内容?
答案 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
的简单活动应该是现实的。
更改后的内存泄漏代码应该在类级别声明handler
和runnable
并在onCreate
函数中实例化,而不是在本地执行块内部实例化。这样做不仅可以防止内存泄漏,还可以更快地执行。