6

次のコードがあります。

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 が上昇します。遅延して停止しているときに ANR が表示されないのはなぜですか(_splashTime)(5 秒以上に増やしても)

4

1 に答える 1

12

知る限り、ハンドラーはメインスレッドで実行されています。

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

しかし、他のスレッドで実行されているスレッドがあります。

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

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

オブジェクトは実行されないため、オブジェクトはスレッド上で実行されません。メソッドが実行されます。MainMenuのようActivityです。アクティビティ ライフサイクル メソッド (例: onCreate()) は、メイン アプリケーション スレッドで呼び出されます。

遅延 (_splashTime) で停止しているのに ANR が表示されないのはなぜですか (5 秒以上に増やしても)

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

また、は使用しないのでに置き換えThreadてください。が実装されているため、コードはコンパイルおよび実行されますが、代わりにを使用すると、コードがバックグラウンド スレッドで実行されることを意味し、実際には実行されないと考えて混乱するでしょう。RunnablepostDelayed()ThreadThreadRunnableThreadRunnable

于 2012-10-27T08:10:11.123 に答える