Android,Handler是在主线程还是其他线程中运行?

时间:2012-10-27 08:04:03

标签: android multithreading handler

我有以下代码。

public class SplashScreen extends Activity {
    private int _splashTime = 5000;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                 WindowManager.LayoutParams.FLAG_FULLSCREEN);

        new Handler().postDelayed(new Thread(){
           @Override
           public void run(){
             Intent mainMenu = new Intent(SplashScreen.this, MainMenu.class);
             SplashScreen.this.startActivity(mainMenu);
             SplashScreen.this.finish();
             overridePendingTransition(R.drawable.fadein, R.drawable.fadeout);
           }
        }, _splashTime);
    }
}

我在分析这段代码时遇到了问题。至于知道处理程序在主线程中运行。但它有在其他线程中运行的线程。

MainMenu.class 将在主线程或第二个线程中运行? 如果主线程停止5秒,ANR将被提升。为什么当我以延迟(_splashTime)停止它时ANR不显示(即使我将其增加到超过5秒)

1 个答案:

答案 0 :(得分:12)

  

知道处理程序在主线程中运行。

对象不在线程上运行,因为对象不会运行。方法运行。

  

但它有在其他线程中运行的线程。

您尚未发布任何涉及任何“其他线程”的代码。上面代码清单中的所有内容都与流程的主应用程序线程相关联。

  

MainMenu.class将在主线程或第二个线程中运行吗?

对象不在线程上运行,因为对象不会运行。方法运行。 MainMenu似乎是Activity。在主应用程序线程上调用活动生命周期方法(例如,onCreate())。

  

为什么我延迟停止它(_splashTime)ANR不显示(即使我将它增加到5秒以上)

你不是“延迟停止[主应用程序线程]”。您已计划在延迟Runnable毫秒后在主应用程序线程上运行_splashTime。但是,postDelayed()不是阻止通话。它只是在事件队列上放置一个事件,该事件将不会执行_splashTime毫秒。

此外,请将Thread替换为Runnable,因为postDelayed()不使用Thread。您的代码编译并运行,因为Thread实现了Runnable,但您会因为认为使用Thread代替Runnable而意味着您的代码将在后台线程上运行而让您感到困惑,它不会。