启动画面的首选方式是什么? - 使用处理程序或创建新线程?

时间:2014-09-13 16:58:01

标签: android multithreading performance android-layout splash-screen

我正在following this tutorial制作一个闪屏。

在这里,海报提到了两种创建闪屏的方法。

方法1:创建thread并在重定向到主应用屏幕后将时间设置为sleep

  Thread background = new Thread() {
            public void run() {

                try {
                    // Thread will sleep for 5 seconds
                    sleep(5*1000);

                    // After 5 seconds redirect to another intent
                    Intent i=new Intent(getBaseContext(),FirstScreen.class);
                    startActivity(i);

                    //Remove activity
                    finish();

                } catch (Exception e) {

                }
            }
        };

        // start thread
        background.start();

方法2:将时间设置为handler并调用Handler().postDelayed,它会在设置时间后调用runnable的运行方法并重定向到主应用。< / p>

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

        // Using handler with postDelayed called runnable run method

        @Override
        public void run() {
            Intent i = new Intent(MainSplashScreen.this, FirstScreen.class);
            startActivity(i);

            // close this activity
            finish();
        }
    }, 5*1000);

我搜索过邻居无法找到这两种方法之间的区别。

任何人都可以说我在使用资源和内存的情况下首选哪种方式?

3 个答案:

答案 0 :(得分:2)

您是否需要使用启动画面来显示徽标,或者您是否真的需要做一些工作?

如果您没有任何实际处理过的内容,Google强烈建议您只加载第一项活动。

如果你必须做一些初始化时间,请使用AsyncTask,如下所示:

public class SplashActivity extends Activity {

  private final static int SHOW_TIME = 1300;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    new LoadTask().executeOnThreadPool();

  }


  class LoadTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Boolean doInBackground(Void... params) {
      long startTime = System.currentTimeMillis();

      // Do the work you need (download resources, etc...)

      // Stay on screen for the minimum SHOW_TIME, even if we finished before.
      long remainingTime = SHOW_TIME - (System.currentTimeMillis() - startTime);
      if (remainingTime > 0) {
        try {
          Thread.sleep(remainingTime);
        } catch (InterruptedException e) {
        }
      }


      return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
      // Continue to next activity.
      Intent intent = new Intent(this, YOUR_MAIN_ACTIVITY.class);
      startActivity(intent);


      finish();

    }
  }

}

答案 1 :(得分:2)

技术上方法2(使用处理程序)是要走的路。方法1在后台线程上调用UI内容,这可能会导致错误的结果。

答案 2 :(得分:0)

现在,我找到了基于this search的正确答案。

postDelayed()Runnable放入处理程序线程的消息队列中。当控件返回到线程Looper时,处理消息队列。

Thread.sleep()只是阻止线程。控件不会返回Looper,也无法处理消息。

不过,谢谢盖伊和所有人。