2012-10-27 151 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

這麼多有用的信息在一個單一的答案。 –

相關問題