Android中的sleep()方法如何不阻塞用户界面?

27

我需要一个函数,在我的新Android应用中将应用程序超时3秒。我尝试了这样的函数“sleep()”:

seekBar1.setProgress(50);                // Set something for my SeekBar

try{
   Thread.sleep(3000);                   // Wait for 3 Seconds
} catch (Exception e){
   System.out.println("Error: "+e);      // Catch the exception
}

button.setEnabled(true);                 // Enable my button

看起来它可以工作,但如果我正在运行应用程序,它会这样做:等待3秒钟,设置进度并启用按钮。 我想先设置进度,然后等待3秒钟,然后才启用按钮。

"sleep()"对于我的用途是否正确,还是我还能做些什么以使我的应用程序按正确顺序执行?


你可以使用处理程序 new Handler().postDelayed(new Runnable() { @Override public void run() { button.setEnable(true); } },3000); - Konrad Krakowiak
如果这对你有效,就直接使用吧。 - Jonas Czech
4个回答

49

你可以像这样使用postDelayed()方法:

handler=new Handler();
Runnable r=new Runnable() {
    public void run() {
        //what ever you do here will be done after 3 seconds delay.              
    }
};
handler.postDelayed(r, 3000);

2

不应该在UI线程中使用sleep方法阻塞程序。虽然在其他线程上使用sleep方法是可以的,但最好还是避免使用。正确的做法是将一个Runnable对象发布到Handler中,然后将想要延迟执行的代码放入Runnable的run()方法中。


1
您可以在Activity中定义一个Handle,并在Activity的onCreate()中使用Handle.postDelayed(),以便在3秒后在该handle上接收消息。收到消息后,您可以启用按钮。
您也可以使用AsyncTask执行相同的操作,在doInBackground()中睡眠3秒钟,然后在onPostExecute()中启用按钮。

我不建议使用 AsyncTask 的方式。为了实现3秒延迟,创建一个新的线程太过费力。使用 Handler 是正确的做法。 - Gabe Sechan
此外,AsyncTask 在单个线程上一个接一个地运行,因此如果另一个 AsyncTask 正在运行,这个新的任务可能要等很长时间才能被调用。 - Gabe Sechan

1
使用Handler类的对象,并使用方法handler.postDelayed(thread,time)。不要使用sleep(),它会阻塞UI线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接