学习Android开发。
在转到for
循环中的下一个语句之前,代码必须等待几秒/分钟/小时。
for( i=0; i<number; i++) {
// Do Something
// Then Wait for x hours, y minutes, and z seconds. Then proceed to next command.
// Do some more things.
} //End for loop.
我搜索了这个,但找到了许多答案,例如thread.Sleep
,Sleep
,try{wait(); } Catch{ }
等等。
另外,发现了Handler
。我可以在Handler
循环中使用for
吗?
相反,是否有一个简单的命令,如wait(x小时,x分钟,x秒);这样的事情?
请帮助!!
答案 0 :(得分:2)
这取决于你在哪里循环。如果你在主线程中运行循环,你就不能简单地插入一个延迟&#34;进入它,因为它会阻止执行,并且Java没有像C#async
&amp; await
那样容易地和#34;解决这个问题因此,最简单的方法是:首先,将整个循环移动到后台线程。 然后,您可以在需要延迟的地方使用Thread.sleep(…)
。但是,如果你需要更新UI,你不能直接从后台线程执行此操作,则需要使用Handler,调用post(Runnable)
方法(传递的Runnable将在主线程上运行),以及在Runnable中你必须检查用户界面是否还活着(因为用户可以&#34;关闭&#34;应用程序,所以你的活动/片段/视图/任何可以完成或者在#34;坏&#34 ;州)
答案 1 :(得分:1)
在Android中,有一个类可以完成您所说的所有内容,AsyncTask。
private class YourTaskClassName extends AsyncTask<Void, Integer, Long> {
protected Long doInBackground(Void.. values) {
//Here is where you do the loop
for (int i = 0; i < number; i++) {
...
publishProgress(yourProgress); //Value passed to onProgressUpdate
}
return totalSize; //Value for onPostExecute
}
protected void onProgressUpdate(Integer... progress) {
//Here is what you wanna show while your loop is running in background
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
//Here is what you wanna do when your loop has finished
}
}
你可以这样称呼new YourTaskClassName().execute();
答案 2 :(得分:0)
Thread.sleep(time_in_miliseconds)
看起来像最简单的解决方案。它是一个静态方法,因此您不需要Thread类的实例。
答案 3 :(得分:0)
Wait是一种监视方法,这意味着您可以从synchronized块或方法中调用该方法。 为你的情况使用睡眠。
答案 4 :(得分:0)
我过去曾做过Android编程但不是最近。我已经做了很多Java,并认为我仍然会有所帮助。
关于Handler,看起来你可以做到这一点。看过文档http://developer.android.com/reference/android/os/Handler.html#handleMessage(android.os.Message),基本上你是从一个线程发布消息或runnables并在另一个线程中处理消息。你的for循环不会因为你在使用处理程序时启动一个新线程而停止。
创建处理程序时,如果它是一条消息或发布您正在发送的runnable,则需要覆盖handleMessage(Message msg)方法,因为这是在适当的时间已经过去之后调用的方法。要在特定时间或延迟的时间后发送消息,您可以使用postAtTime,postDelayed,sendMessageAtTime和sendMessageDelayed方法,无论哪个方法都需要。
new Handler() {
public void handleMessage(Message msg) {
// Your code here.
}
}.sendMessageDelayed(yourMessage, theAmountOfTimeInMilles);
此外,在处理完邮件后,如果要进行任何用户界面更新(换句话说,更改任何图形,例如更新标签或更改背景),则需要使用runOnUiThread方法,否则它会引发异常:
runOnUiThread(new Runnable() {
public void run() {
// Code including UI code here.
}
});