私は以下のコードを持っています。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はメインスレッドまたは2番目のスレッドで実行されますか? メインのスレッドを5秒間停止すると、ANRが上がります。なぜ私が遅れ(_splashTime)
でそれを停止していたときにANRは限りハンドラはメインスレッドで実行されている知っているよう
Mr. Murphy。私はJavaとAndroidのコンセプトを得られなかったことを示しています:)私は、新しいHandler()に "new Thread()"があると思ったので、postDelayedを実行すると新しいスレッドが作成されます。 – Hesam
@Hesam:あなたは 'Thread'オブジェクトのインスタンスを作成しています。しかし、実際のOS *スレッド*は、あなたの 'Thread'オブジェクトで' start() 'を呼び出さない限り作成されません。 'postDelayed()'はオブジェクトを 'Runnable'と考えるので、' postDelayed() 'は' start() 'を呼び出さず、' run() 'だけを呼び出します。したがって、 'run()'コードはバックグラウンドスレッドではなくメインアプリケーションスレッド上で実行されます。 – CommonsWare
多くの有用な情報が1つの回答に含まれています。 –