2012-10-27 16 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はメインスレッドまたは2番目のスレッドで実行されますか? メインのスレッドを5秒間停止すると、ANRが上がります。なぜ私が遅れ(_splashTime)でそれを停止していたときにANRは限りハンドラはメインスレッドで実行されている知っているよう

答えて

11

(私は5秒以上に増やしても)表示されません。

オブジェクトは実行されないため、オブジェクトはスレッド上で実行されません。メソッドが実行されます。

他のスレッドで実行中のスレッドがあります。

あなたは「他のスレッド」を含むコードを掲載していません。上のコードリストのすべては、プロセスのメインアプリケーションスレッドに関連付けられています。

MainMenu.classはメインスレッドまたは2番目のスレッドで実行されますか?

オブジェクトは実行されないため、オブジェクトはスレッド上で実行されません。メソッドが実行されます。 MainMenuActivityと思われます。アクティビティライフサイクルメソッド(例:onCreate())は、メインアプリケーションスレッドで呼び出されます。あなたは、「[メインアプリケーションスレッドを停止されていない、私は遅れてそれを停止していたときに(_splashTime)ANRは(私は5秒以上に増やしても)

が表示されないのはなぜ

]遅れて "。遅延_splashTimeミリ秒後にメインアプリケーションスレッドでRunnableを実行するようにスケジュールしました。ただし、postDelayed()はブロッキングコールではありません。 _splashTimeミリ秒間実行されないイベントキューにイベントを格納するだけです。

またpostDelayed()Threadを使用していないため、をRunnableに置き換えてください。 ThreadRunnableを実装しているため、コードはコンパイルされて実行されますが、Runnableの代わりにThreadを使用すると、コードがバックグラウンドスレッドで実行されることになります。

+0

Mr. Murphy。私はJavaとAndroidのコンセプトを得られなかったことを示しています:)私は、新しいHandler()に "new Thread()"があると思ったので、postDelayedを実行すると新しいスレッドが作成されます。 – Hesam

+1

@Hesam:あなたは 'Thread'オブジェクトのインスタンスを作成しています。しかし、実際のOS *スレッド*は、あなたの 'Thread'オブジェクトで' start() 'を呼び出さない限り作成されません。 'postDelayed()'はオブジェクトを 'Runnable'と考えるので、' postDelayed() 'は' start() 'を呼び出さず、' run() 'だけを呼び出します。したがって、 'run()'コードはバックグラウンドスレッドではなくメインアプリケーションスレッド上で実行されます。 – CommonsWare

+0

多くの有用な情報が1つの回答に含まれています。 –

関連する問題