Android中,Handler是运行在主线程还是其他线程?

2023-11-23

我有以下代码。

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);
    }
}

我在分析这段代码时遇到问题。据了解处理程序正在主线程中运行。但它有一个正在其他线程中运行的线程。

主菜单类将在主线程或第二线程中运行? 如果主要thread停止 5 秒 ANR 将升高。为什么当我延迟停止时(_splashTime)ANR不显示(即使我将其增加到超过5秒)


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

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

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

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

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

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

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

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

另外,请更换Thread with Runnable, since postDelayed()不使用Thread。您的代码可以编译并运行,因为Thread实施Runnable,但是你会因为认为使用而感到困惑Thread代替Runnable意味着您的代码将在后台线程上运行,但事实并非如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中,Handler是运行在主线程还是其他线程? 的相关文章

随机推荐