我试着这样做
@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");
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,我运行时只显示第二个文本.我认为它可能与Thread.sleep()方法阻塞有关.那么有人能告诉我如何"异步"实现定时器吗?
谢谢.
Zor*_*did 147
你的onCreate()方法有几个巨大的缺陷:
1)onCreate 准备你的活动 - 所以在这个方法完成之前,你在这里做的任何事情都不会被用户看到!例如-你将永远无法改变TextView这里的文本超过ONE,因为只有最后一次更改将绘制时间,从而对用户可见!
2)请记住,Android程序 - 默认情况下 - 只在一个线程中运行!因此:永远不要使用Thread.sleep()或Thread.wait()在您的主线程中负责您的UI!(阅读"保持应用程序响应"以获取更多信息!)
你的初始化你的活动所做的是:
TextView对象t!TextView在变量中选择你的布局t.t(但请记住:它只会在 onCreate()完成后显示,并且应用程序的主事件循环运行!)onCreate - 这绝不能完成,因为它会停止所有UI活动,并且肯定会强制ANR(应用程序无响应,请参阅上面的链接!)onCreate()方法完成并且处理了其他几个Activity生命周期方法,这个文本就会显示出来!解决方案:
只设置一次文本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();
Run Code Online (Sandbox Code Playgroud)安装这个runnable作为处理程序,可能在onCreate()(但请阅读我的建议):
// run the mUpdateUITimerTask's run() method in 10 seconds from now
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
Run Code Online (Sandbox Code Playgroud)建议:确保你知道一个Activity人的生命周期!如果你做这样的事情onCreate()只会Activity在第一次创建时发生!Activity即使它不可见,Android也可能会让你活着更长时间!当用户再次"启动"它 - 它仍然存在 - 您将不再看到您的第一个文本!
=>始终安装处理程序onResume()并禁用它们onPause()!否则,当您Activity根本看不到时,您将获得"更新" !在您的情况下,如果您想在重新激活时再次看到第一个文本,则必须将其设置为onResume(),而不是onCreate()!
snc*_*tln 45
我刚刚在android-discuss谷歌小组中发布了这个答案
如果您只是想在视图中添加文本以便显示"第一步:爆蛋第二步:煎鸡蛋"然后考虑使用t.appendText("Step Two: fry egg"); 而不是t.setText("Step Two: fry egg");
如果你想完全改变TextView它的内容,那么在启动时它会说"第一步:爆蛋"然后它会说"第二步:煎鸡蛋",之后你可以随时使用
Runnable示例sadboy给了
祝好运
Pat*_*fka 14
新文本视图的第一行是不必要的
t=new TextView(this);
Run Code Online (Sandbox Code Playgroud)
你可以这样做
TextView t = (TextView)findViewById(R.id.TextView01);
Run Code Online (Sandbox Code Playgroud)
至于睡在这里的后台线程是一个例子,但我认为有一个更好的计时器.这里是使用计时器的一个很好的例子的链接,而不是 http://android-developers.blogspot.com/2007/11/stitch-in-time.html
Thread thr = new Thread(mTask);
thr.start();
}
Runnable mTask = new Runnable() {
public void run() {
// just sleep for 30 seconds.
try {
Thread.sleep(3000);
runOnUiThread(done);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable done = new Runnable() {
public void run() {
// t.setText("done");
}
};
Run Code Online (Sandbox Code Playgroud)
@ user264892
我发现当使用String变量时,我需要使用字符串""前缀或显式强制转换为CharSequence.
所以代替:
String Status = "Asking Server...";
txtStatus.setText(Status);
Run Code Online (Sandbox Code Playgroud)
尝试:
String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);
Run Code Online (Sandbox Code Playgroud)
要么:
String Status = "Asking Server...";
txtStatus.setText("" + Status);
Run Code Online (Sandbox Code Playgroud)
或者,因为你的字符串不是动态的,甚至更好:
txtStatus.setText("AskingServer...");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
453610 次 |
| 最近记录: |