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将在主线程或第二线程中运行?如果主线程停止 5 秒 ANR 将被提高。为什么当我延迟停止它时(_splashTime)ANR 不显示(即使我将它增加到超过 5 秒)

4

1 回答 1

12

据了解处理程序正在主线程中运行。

对象不在线程上运行,因为对象不运行。方法运行。

但它有在其他线程中运行的线程。

您尚未发布任何涉及任何“其他线程”的代码。上面代码清单中的所有内容都与进程的主应用程序线程相关联。

MainMenu.class 将在主线程或第二线程中运行?

对象不在线程上运行,因为对象不运行。方法运行。MainMenu似乎是一个Activity. 活动生命周期方法(例如,onCreate())在主应用程序线程上调用。

为什么当我延迟停止它时(_splashTime)ANR 不显示(即使我将它增加到超过 5 秒)

您不是“延迟停止[主应用程序线程]”。您已安排 a在延迟毫秒Runnable后在主应用程序线程上运行。_splashTime但是,postDelayed()不是阻塞调用。它只是将一个事件放在事件队列上,该事件不会在_splashTime几毫秒内执行。

另外,请替换ThreadRunnable,因为postDelayed()不使用Thread。您的代码可以编译并运行,因为Threadimplements Runnable,但是您会误以为使用Thread而不是Runnable意味着您的代码将在后台线程上运行,而事实并非如此。

于 2012-10-27T08:10:11.123 回答