题
我试图做这个
@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()
法阻止。因此可以有人告诉我如何实现一个定时器"异步"?
谢谢。
解决方案
我刚刚发布的这个答案Android的讨论Google组
如果你只是想将文本添加到视图,以便显示“步骤一:鸡蛋爆炸第二步:炒鸡蛋”再考虑使用t.appendText("Step Two: fry egg");
代替t.setText("Step Two: fry egg");
如果您想彻底改变什么是在TextView
以便它说:“第一步:爆蛋”上启动,然后将其“第二步:炒鸡蛋说:”经过一段时间以后,你可以随时使用
可运行例如sadboy给
好运
其他提示
你的 onCreate()
方法有几个巨大缺陷:
1) onCreate
准备 你活性-因此,什么,你在这里做将 可见 要用户,直到这种方法完成!例如,你将永远不能改变 TextView
's的文字在这里多 一个 时间仅作为最后一个改变将制订并由此可见的用户!
2)请记住,安卓程序将会默认情况下运行中 一个 螺纹!因此:永远不会使用 Thread.sleep()
或 Thread.wait()
在你的主线是负责你的用户界面!(阅读 "让你的应用程序响应" 进一步的信息!)
什么你的 初始化 你的活动确实是:
- 没有理由创建一个新的
TextView
对象t
! - 你拿起你的布局
TextView
在变t
以后。 - 你设置的案文
t
(但请记住:它将仅显示 后onCreate()
完成和主要事件循环的应用程序的运行!) - 你在等待 10秒钟 在你
onCreate
方法-这个 必须永远不会做的 因为它停止所有UI活动和将绝对强制ANR(没有响应,请参阅上面的链接!) - 那么你设定的另一个文本,这将是一个显示,一旦你的
onCreate()
方法完成与其他几个 活动生命周期 方法已经处理!
该解决方案:
设置文本中只有一次
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
's生命周期的!如果你做这样的东西在 onCreate()
这只会发生时你的 Activity
是创造的 第一 时间!机器人将有可能保持你的 Activity
活着为一段较长的时间,即使它不可见的!当用户"开始"一遍-和它仍然是现有的-你不会看到你的第一个文本了!
=>总是安装在处理程序 onResume()
并禁止他们 onPause()
!否则你会得到"更新"当你的 Activity
是不见了!在你的情况下,如果你想要看看你的第一个文本时,再次重新激活,你必须将它设置在 onResume()
, ,不 onCreate()
!
的新文本视图的第一行是不必要的
t=new TextView(this);
你可以做到这一点。
TextView t = (TextView)findViewById(R.id.TextView01);
据该睡在这一个后台线程是一个例子,但我觉得有一个计时器,将是这更好的。这里是使用定时器,而不是一个很好的例子,一个链接 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");
}
};
@ user264892
我发现,使用一个字符串变量,当我需要与“一个字符串或者前缀”或显式转换为CharSequence中。
因此,而不是:
String Status = "Asking Server...";
txtStatus.setText(Status);
尝试:
String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);
或:
String Status = "Asking Server...";
txtStatus.setText("" + Status);
或者,因为你的字符串不是动态的,甚至更好:
txtStatus.setText("AskingServer...");
每你的意见中,我使用手柄和可运行到开关/改变使用“计时器” TextView的的内容。由于某些原因,在运行时,该应用总是跳过第二步骤(“第二步:炒鸡蛋”),并且仅示出了最后一个(第三)步骤(“第三步:服务蛋”)。
TextView t;
private String sText;
private Handler mHandler = new Handler();
private Runnable mWaitRunnable = new Runnable() {
public void run() {
t.setText(sText);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMonster = BitmapFactory.decodeResource(getResources(),
R.drawable.monster1);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
sText = "Step One: unpack egg";
t.setText(sText);
sText = "Step Two: fry egg";
mHandler.postDelayed(mWaitRunnable, 3000);
sText = "Step three: serve egg";
mHandler.postDelayed(mWaitRunnable, 4000);
...
}
:)你用错误的方式线程。 只是执行以下操作:
private void runthread()
{
splashTread = new Thread() {
@Override
public void run() {
try {
synchronized(this){
//wait 5 sec
wait(_splashTime);
}
} catch(InterruptedException e) {}
finally {
//call the handler to set the text
}
}
};
splashTread.start();
}
就是这样。
设置文本到SAM TextView的两倍是覆盖第一个书面文本。 所以第二遍的时候,我们使用的setText我们只是追加像
新的字符串textview.append("Step Two: fry egg");
@Zordid @Iambda答案是伟大的,但我发现,如果我把
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
在run()方法和
mHandler.postDelayed(mUpdateUITimerTask, 0);
在onCreate方法使事情不断更新。