如果我使用postDelayed方法,我的问题是我的Android应用程序不会延迟一秒(或10秒)..
基本上我希望我的程序在单击按钮后等待一秒钟,然后在我的textview上更新文本(" READY"),再等2秒,然后再次更新textview(&# 34; 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();
}
}
}
});
希望我的描述有意义: - )。
感谢您的帮助!
编辑: 我现在能够找到第一个问题的解决方案。 @mad在这篇文章中给出的答案帮助了我:How to start a different activity with some delay after pressing a button in android? (这可能与@laalto试图告诉我的事情相同。感谢提示!)
在onClick()
中 tv1.setText("READY");
mHandler.postDelayed(mDelay1, 2000);
然后是Runnable
private Runnable mDelay1 = new Runnable() {
@Override
public void run() {
if (tv1.getText()=="READY")
tv1.setText("SET");
}
};
BUT: 如果我想在每秒后刷新Textview上的文本,我该怎么做?我不能多次调用mHandler.postDelayed()..感谢任何帮助。
答案 0 :(得分:2)
当您致电postDelayed()
时,它只会将Runnable
放入队列并立即返回。它不会等待runnable被执行。
如果您需要在延迟后发生某些事情,请将代码放在runnable的run()
方法中。
答案 1 :(得分:0)
每当调用诸如Thread.start(),handler.postDelayed,view.postDelayed,AsynchTask,TimerTask之类的东西时,您都会进入线程世界,或者您可以将其称为并行计算。
因此可以有多个线程(“代码”)同时运行。
当您进入Activity时,它会在称为 UI线程的线程或主线程中运行。所有图形都在该线程中处理,并且仅在该线程中处理。
请勿在UI线程中等待!
示例:您有一个按钮,按下该按钮可以将颜色从灰色切换为黄色。现在您输入Thread.sleep(10000); -在onClick开始时等待10秒钟。 然后,您将看到按钮保持黄色(=按下)10秒钟,即使您只是非常短地按下也是如此。另外:如果操作过度,Android os会生气,并在用户要强制关闭您的应用程序时将其发布。
那么在handler.postDelayed上会发生什么?
Android将非常快速地打开一个在后台与您的UI线程并行运行的线程。因此,它已经完成了几纳秒,并且将在UI线程中执行下一个命令(在上面的示例中是Log.d)。在后台,它将等待并计数毫秒,直到时间到了。然后,等待之后,将再次在ui线程中执行runnable.run方法内部的任何代码。
还请注意:postDelayed在等待时间上不会非常精确,因为通常ui线程非常忙碌,等待时间到时可能还有其他事情要做。您的可运行代码将添加到队列中,并在ui-thread再次准备就绪时执行。这一切都发生在您不需要做任何事情的情况下。
也: 记住要在runnable.run内部使用try / catch进行操作,因为在等待期间可能发生许多事情-例如用户可以按下Home按钮关闭您的应用程序-这样,您希望在等待之后更改的ui元素可能已被破坏。>