我的问题是,如果我使用postDelayed方法,我的安卓应用程序不会延迟一秒钟(或10秒)。
基本上,我希望我的程序在单击按钮后等待一秒钟,然后更新textview ("READY")上的文本,再等待2秒,然后再次更新textview ("SET"),然后它应该启动另一个活动(尚未实现:-)。
使用我的代码,程序启动,在我单击按钮后,textview立即显示最后一个文本("SET")。它不需要等待。
我做错什么了?
这是我的代码:
public class MyCounterActivity extends Activity {
private long mInternval = 100000;
private Handler mHandler;
private Runnable mStatusChecker = new Runnable() {
@Override
public void run() {
//updateInterval(); //change interval
startRepeatingTask();
}
};
void startRepeatingTask(){
mHandler.postDelayed(mStatusChecker, mInternval);
//mStatusChecker.run();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gym_counter);
final TextView tv1 = (TextView) findViewById(R.id.fullscreen_content);
final Button startButton = (Button) findViewById(R.id.startbutton);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final long up;
EditText textUp = (EditText) findViewById(R.id.editTextUp);
up = Integer.parseInt(textUp.getText().toString());
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//
}
},1000);
Log.d("after 1 runnable", "whaaat");
tv1.setText("Ready");
handler.postDelayed(new Runnable() {
@Override
public void run() {
//
}
}, 2000);
Log.d("after 2nd runnable", "whaaat 2");
//startRepeatingTask();
tv1.setText("SET");
}
});
}我还尝试用runOnUiThread()运行它(在onClick(View v)中,但结果相同)。我期望它等待1秒(startRepeatingTask()),然后运行循环并等待几秒钟.
runOnUiThread(new Runnable() {
@Override
public void run() {
startRepeatingTask();
for (int u = 0; u < up; u++){
startRepeatingTask();
}
}
}
});希望我的描述有意义:-)。
谢谢你的帮助!
编辑:我现在能够找到我的第一个问题的解决方案。在这篇文章中,“疯狂”的回答帮助了我:How to start a different activity with some delay after pressing a button in android? (这可能和@laalto试图告诉我的一样。谢谢你的暗示!)
在onClick()中
tv1.setText("READY");
mHandler.postDelayed(mDelay1, 2000);然后是可跑的
private Runnable mDelay1 = new Runnable() {
@Override
public void run() {
if (tv1.getText()=="READY")
tv1.setText("SET");
}
};但是:如果我想在每一秒之后刷新我的Textview上的文本,我如何做到这一点?我不能只打几次电话给mHandler.postDelayed()。任何帮助都是非常感谢的。
发布于 2015-02-15 17:12:37
当您调用postDelayed()时,它只是将Runnable放在一个队列中并立即返回。它不会等待可运行的执行。
如果您需要在延迟之后发生一些事情,请将代码放在runnable的run()方法中。
发布于 2020-04-23 16:25:49
每当你调用像Thread.start(),handler.postDelayed,view.postDelayed,AsynchTask,TimerTask之类的东西。你进入了线程的世界,或者你可以称之为并行计算。
因此,可以同时运行多个线程(“代码”)。
当您在活动中时,它运行在一个线程中,即calld、、UI线程、或主线程。所有图形都是在该线程中处理的,而该线程则是单独处理的。
从不在UI线程中等待!
例子:你有一个按钮,按下它时,颜色从灰色切换到黄色。现在输入一个Thread.sleep(10000);-在onClick开始时等待10秒。然后,您将看到按钮保持黄色(=按下)10秒,即使您只按了很短的时间。另外:如果你做得太过火了,android操作系统会生气,如果用户想强行关闭你的应用程序,他会发帖。
那么在handler.postDelayed上会发生什么呢?
Android将非常迅速地打开一个运行在与UI线程并行的后台的线程。因此,在几纳秒内,它已经这样做了,并将在UI线程中执行下一个命令(在上面的示例中是Log.d)。在后台,它将等待和计数米利斯,直到时间结束。然后,在等待之后,runnable.run方法中的任何代码都将再次在ui线程中执行。
还要注意: postDelayed对于等待时间并不是非常精确,因为通常ui线程是相当复杂的,当等待时间结束时,它可能还有其他的事情要做。您的可运行代码将添加到队列中,并在ui线程再次准备就绪时执行。所有这一切都发生在你没有做任何事情的情况下。
另外:请记住,在runnable.run中使用try/catch,因为等待时可能会发生许多事情--例如,用户可以按Home按钮关闭应用程序--这样,在等待被销毁后,您想要更改的ui元素就会发生。
https://stackoverflow.com/questions/28528692
复制相似问题