2013-02-18 69 views
1

我有一个启动画面(徽标活动),显示应用程序启动前3秒的公司名称。我从一个线程开始主要活动,这里是代码:从Splash Screen开始一个活动,我应该使用run()还是runOnUiThread()?

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(); 
} 

主活动从一个工作线程调用,这是正确的吗?这个代码有什么不同(使用runOnUiThread)?

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

我看到在调试模式下(相同的线程,相同的操作等)与此代码没有什么区别。哪个是对的?

回答

3

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

0

你应该在“doInBackground”后台线程使用的AsyncTask,比睡你的线程(此线程不UIThread)“PostExecute”在UI线程上运行比启动新的活动

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

protected void doInBackground(Void params){ 

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

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

} 
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! 
} 
相关问题