Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从启动屏幕启动活动,我应该使用run()还是runOnUiThread()?_Java_Android_Multithreading_Splash Screen - Fatal编程技术网

Java 从启动屏幕启动活动,我应该使用run()还是runOnUiThread()?

Java 从启动屏幕启动活动,我应该使用run()还是runOnUiThread()?,java,android,multithreading,splash-screen,Java,Android,Multithreading,Splash Screen,我有一个闪屏徽标活动,在应用程序启动前显示公司名称3秒钟。我从一个线程开始主活动,下面是代码: public class Logo extends Activity { Thread t; public boolean dead = false; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.logo);

我有一个闪屏徽标活动,在应用程序启动前显示公司名称3秒钟。我从一个线程开始主活动,下面是代码:

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的代码有什么不同


在调试模式下,相同的线程、相同的操作等,我看不出这段代码有什么不同。。哪个是正确的?

启动一个意图,我认为这不是一个UI操作。runOnUI线程在UI线程上运行UI操作。因此,您可以使用线程rununui或normal。可能是正常的线程将在这种情况下良好。但我想建议您改用定时器。

启动一个意图,我认为这不是一个UI操作。runOnUI线程在UI线程上运行UI操作。因此,您可以使用线程rununui或normal。可能是正常的线程将在这种情况下良好。但我想建议您改用计时器。

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

}

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

}

老实说,我不喜欢这根线。睡觉吧。请看一下我的解决方案:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
      // Do your work here like... startActivity...
    }
}, SPLASH_DURATION); // SPLASH_DURATION IS IN MILLISECONDS LIKE 3000
您还可以阻止用户使用back键,如下所示:

@Override
public void onBackPressed() {
    // do nothing! disable user interaction!
}

老实说,我不喜欢这根线。睡觉吧。请看一下我的解决方案:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
      // Do your work here like... startActivity...
    }
}, SPLASH_DURATION); // SPLASH_DURATION IS IN MILLISECONDS LIKE 3000
您还可以阻止用户使用back键,如下所示:

@Override
public void onBackPressed() {
    // do nothing! disable user interaction!
}