28

我正在按照本教程在我的程序中有一个加载屏幕。该教程说我的活动应该使用 Sleep() 命令进行 Sleep(),但是它不将 Sleep() 识别为一个函数并给我一个错误,询问我是否要创建一个名为 Sleep() 的方法。

这是代码示例:

public class LoadingScreenActivity extends Activity {

    //Introduce an delay
    private final int WAIT_TIME = 2500;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        System.out.println("LoadingScreenActivity screen started");

        setContentView(R.layout.loading_screen);
        findViewById(R.id.mainSpinner1).setVisibility(View.VISIBLE);

        new Handler().postDelayed(new Runnable(){ 

            @Override 
            public void run() {

                //Simulating a long running task
                this.Sleep(1000);
                System.out.println("Going to Profile Data");

                /* Create an Intent that will start the ProfileData-Activity. */
                Intent mainIntent = new Intent(LoadingScreenActivity.this,ProfileData.class); 
                LoadingScreenActivity.this.startActivity(mainIntent);
                LoadingScreenActivity.this.finish(); 
            } 
        }, WAIT_TIME);
    }
}
4

4 回答 4

61

您可以使用以下方法之一:

Thread.sleep(timeInMills);

或者

SystemClock.sleep(timeInMills);

SystemClock.sleep(milliseconds)是一个与 非常相似的效用函数Thread.sleep(milliseconds),但它忽略了InterruptedException。如果不使用,请使用此函数进行延迟Thread.interrupt(),因为它将保留线程的中断状态。

于 2013-02-18T17:32:18.543 回答
8

功能是Thread.sleep(long)

但是请注意,您不应在 UI 线程上执行休眠。

于 2013-02-18T17:14:20.210 回答
5

您发布的代码很糟糕。请不要在实际设备上使用它。如果您运行与此类似的操作,您将收到“应用程序无响应”错误。

如果您使用的是处理程序,请记住处理程序是在它运行的线程上创建的。所以在UI线程上调用new Handler().post(...会在UI线程上执行runnable,包括这个“长时间运行的操作”。优点是您可以为以后使用的 UI 线程创建一个处理程序,如下所示。

要将长时间运行的操作放到后台线程中,需要围绕runnable创建一个Thread,如下所示。现在,如果您想在长时间运行的操作完成后更新 UI,您需要使用 Handler 将其发布到 UI 线程。

请注意,此功能非常适合AsyncTask使这看起来比下面的模式更干净。但是,我将其包含在内是为了展示 Handlers、Threads 和 Runnables 之间的关系。

public class LoadingScreenActivity extends Activity {

//Introduce a delay
    private final int WAIT_TIME = 2500;
    private Handler uiHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHandler = new Handler(); // anything posted to this handler will run on the UI Thread
        System.out.println("LoadingScreenActivity  screen started");
        setContentView(R.layout.loading_screen);
        findViewById(R.id.mainSpinner1).setVisibility(View.VISIBLE);

        Runnable onUi = new Runnable() {
            @Override 
            public void run() {
                // this will run on the main UI thread 
                Intent mainIntent = new Intent(LoadingScreenActivity.this,ProfileData.class); 
                LoadingScreenActivity.this.startActivity(mainIntent); 
                LoadingScreenActivity.this.finish(); 
            }
        }; 

        Runnable background = new Runnable() { 
            @Override 
            public void run() { 
                // This is the delay
                Thread.Sleep( WAIT_TIME );
                // This will run on a background thread
                //Simulating a long running task
                Thread.Sleep(1000);
                System.out.println("Going to Profile Data");
                uiHandler.post( onUi );
            }
        };

        new Thread( background ).start(); 
}
于 2013-02-18T17:46:52.533 回答
3

使用 Thread.sleep(1000);

1000 是程序将暂停的毫秒数。

try        
{
    Thread.sleep(1000);
} 
catch(InterruptedException ex) 
{
    Thread.currentThread().interrupt();
}

请记住:不建议使用此代码,因为它会延迟时间但无法控制,可能需要更多或更少的时间。

于 2018-01-17T11:39:00.207 回答