我有以下代碼。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秒)
謝謝墨菲先生。它顯示了我在什麼程度上沒有得到Java和Android的概念:)我認爲,當我們在新的Handler()中有「new Thread()」時,postDelayed會創建新的線程。 – Hesam
@Hesam:好的,你正在創建一個'Thread'對象的實例。但是,除非有人在你的'Thread'對象上調用'start()',否則不會創建實際的OS *線程*。由於'postDelayed()'只是將對象視爲'Runnable','postDelayed()'不會調用'start()',只是'run()'。因此,你的'run()'代碼將在主應用程序線程上執行,而不是後臺線程。 – CommonsWare
這麼多有用的信息在一個單一的答案。 –