2012-10-27 107 views
5

我有以下代码。Android,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秒)

回答

11

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

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

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

您还没有发布任何涉及任何“其他线程”的代码。上面的代码清单中的所有内容都与您的流程的主要应用程序线程绑定在一起。

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

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

为什么当我与延迟停止它(_splashTime)ANR不显示(即使我把它提高到超过5秒)

你是不是“停止[主应用程序线程]延迟“。您已安排Runnable在延迟_splashTime毫秒后在主应用程序线程上运行。但是,postDelayed()不是阻止呼叫。它只是在事件队列中放置一个不会执行_splashTime毫秒的事件。

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

+0

谢谢墨菲先生。它显示了我在什么程度上没有得到Java和Android的概念:)我认为,当我们在新的Handler()中有“new Thread()”时,postDelayed会创建新的线程。 – Hesam

+1

@Hesam:好的,你正在创建一个'Thread'对象的实例。但是,除非有人在你的'Thread'对象上调用'start()',否则不会创建实际的OS *线程*。由于'postDelayed()'只是将对象视为'Runnable','postDelayed()'不会调用'start()',只是'run()'。因此,你的'run()'代码将在主应用程序线程上执行,而不是后台线程。 – CommonsWare

+0

这么多有用的信息在一个单一的答案。 –

相关问题