1

我有一个启动画面(徽标活动),可在应用启动前 3 秒显示公司名称。我从一个线程启动 Main Activity,这里是代码:

public class Logo extends Activity {

Thread t;
public boolean dead = false;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.logo);

    t = new Thread() {
        public void run() {
            try {
                Intent i = new Intent(Logo.this, Main.class);
                Thread.sleep(3000);
                if (!dead) {
                    startActivity(i);
                }
                finish();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    t.start();
}

Main Activity 是从工作线程中调用的,这是正确的吗?此代码(使用runOnUiThread)有什么不同?

...
if (!dead) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
           Intent i = new Intent(Logo.this, Main.class);
           startActivity(i);
        }
    });
}
...

我认为在调试模式下这段代码没有区别(相同的线程、相同的操作等)。哪个是对的?

4

3 回答 3

3

开始一个我认为不是 UI 操作的意图。runOnUI 线程在 UI 线程上运行 UI 操作。因此,您可以使用任一线程(runOnUI 或普通)。在这种情况下,正常线程可能会很好。但我建议您改用计时器。

于 2013-02-18T13:35:31.993 回答
2

老实说,我不喜欢 Thread.sleep。请看看我的解决方案:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
      // Do your work here like... startActivity...
    }
}, SPLASH_DURATION); // SPLASH_DURATION IS IN MILLISECONDS LIKE 3000

您还可以阻止用户以阻止返回键,如下所示:

@Override
public void onBackPressed() {
    // do nothing! disable user interaction!
}
于 2013-02-18T14:46:25.283 回答
0

您应该在“doInBackground”后台线程中使用 AsyncTask,然后在 UI 线程上运行“PostExecute”而不是让您的线程(该线程不是 UIThread)休眠,而不是开始您的新活动

private class mSplashViewer extends AsyncTask<Void,Void,Void>{

 protected void doInBackground(Void params){

   Thread.currentThread().sleep(3000);
   return null;
 }

 protected void onPostExecute(){
  startActivity(...);
 }

}
于 2013-02-18T13:45:48.503 回答