【问题标题】:Start an Activity from Splash Screen, should I use run() or runOnUiThread()?从启动画面启动 Activity,我应该使用 run() 还是 runOnUiThread()?
【发布时间】:2013-02-18 13:26:05
【问题描述】:

我有一个启动画面(徽标活动),可在应用启动前 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);
        }
    });
}
...

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

【问题讨论】:

    标签: java android multithreading splash-screen


    【解决方案1】:

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

    【讨论】:

      【解决方案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!
      }
      

      【讨论】:

        【解决方案3】:

        你应该在“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(...);
         }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2011-02-07
          • 1970-01-01
          • 1970-01-01
          • 2022-11-15
          • 2019-05-30
          • 1970-01-01
          • 2013-01-16
          • 1970-01-01
          • 2022-01-13
          相关资源
          最近更新 更多