我试过这样做
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
t.setText("Step One: blast egg");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.setText("Step Two: fry egg");
但由于某种原因,我运行它时只显示第二个文本。我认为这可能与 Thread.sleep()
方法阻塞有关。那么有人可以告诉我如何“异步”实现计时器吗?
谢谢。
最佳答案
您的onCreate()
方法有几个巨大的缺陷:
1) onCreate
准备您的 Activity - 因此,在此方法完成之前,您在此处所做的任何操作都不会对用户可见!例如 - 您将永远无法更改 TextView
的文本在这里超过 ONE 次,因为只会绘制最后一次更改,因此用户可以看到!
2) 请记住,Android 程序将 - 默认情况下 - 仅在 ONE 线程中运行!因此:永远不要使用 Thread.sleep()
或 Thread.wait()
在您负责您的 UI 的主线程中! (阅读 "Keep your App Responsive" 了解更多信息!)
您的 Activity 初始化所做的是:
- 你无缘无故地创建了一个新的
TextView
对象t
! - 您选择布局的
TextView
在变量t
稍后。 - 您设置了
t
的文本(但请记住:它只会在onCreate()
完成并且应用程序的主事件循环运行后才会显示!) - 您在
onCreate
中等待 10 秒方法 - 绝对不能这样做,因为它会停止所有 UI Activity ,并且肯定会强制 ANR(应用程序无响应,请参阅上面的链接!) - 然后您设置另一个文本 - 此文本将在您的
onCreate()
后立即显示方法完成和其他几个Activity lifecycle方法已处理完毕!
解决办法:
在
onCreate()
中只设置一次文本- 这必须是第一个可见的文本。创建一个
Runnable
和Handler
private final Runnable mUpdateUITimerTask = new Runnable() { public void run() { // do whatever you want to change here, like: t.setText("Second text to display!"); } }; private final Handler mHandler = new Handler();
将此可运行文件安装为处理程序,可能在
onCreate()
中(但请阅读以下我的建议):// run the mUpdateUITimerTask's run() method in 10 seconds from now mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
建议:确保您知道 Activity
的生命周期!如果你在 onCreate()
中做类似的事情这只会发生在您的 Activity
是第一次创建的! Android 可能会保留您的 Activity
即使看不见,也能活得更久!
当用户再次“启动”它时——它仍然存在——你将不再看到你的第一个文本!
=> 始终在 onResume()
中安装处理程序并在 onPause()
中禁用它们!否则,当您的 Activity
时,您将获得“更新”。根本看不到!
在您的情况下,如果您想在重新激活时再次看到您的第一个文本,则必须将其设置为 onResume()
,而不是 onCreate()
!
关于android - 如何在 Android TextView 中更改文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2300169/