android 面试题 谈谈主线程一直循环 为什么不会出现阻塞或者ANR异常

 在ActivityThread类中的main方法有段代码:

 ActivityThread thread = new ActivityThread();
        thread.attach(false, startSeq);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        Looper.loop();

        throw new RuntimeException("Main thread loop unexpectedly exited");

其中的Looper.loop()方法里面有一个死循环,问的是这个,意思是这个死循环为什么不会导致,主线程阻塞或者几秒无响应发生ANR,

对于线程即是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出,例如,binder线程也是采用死循环的方法,通过循环方式不同与Binder驱动进行读写操作ÿ
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Handler 的工作原理是通过消息队列(Message Queue)和线程(Thread)来实现的。当我们使用 Handler 发送消息或者执行延迟任务时,其实是将消息或任务封装成 Message 对象,然后将其加入到消息队列中。然后,Handler 所在的线程会从消息队列中取出消息,并按照一定的逻辑进行处理。 在 Android 中,UI 线程(也称为线程)是用来处理用户界面操作的,例如响应用户的点击事件、更新 UI 界面等。而 Handler 默认是与 UI 线程关联的,通过将消息发送到消息队列中,然后由 UI 线程处理,这样可以保证在 UI 线程中执行相关操作。 当 Handler 执行耗时操作时,如果没有采取适当的措施,可能会导致界面卡顿或 ANR(Application Not Responding)问题。为了避免这种情况发生,通常有以下几种方式: 1. 在线程中避免执行耗时操作:将耗时操作放在子线程中执行,例如使用 AsyncTask、Thread 等方式。 2. 使用 Handler 的 post 方法:通过 post 方法将耗时操作放在 Runnable 对象中,然后通过 Handler.post 方法将其发送到线程中执行。 3. 使用 HandlerThread:HandlerThread 是一个带有 Looper 的线程,可以用于处理耗时操作,并且不会影响线程的响应速度。 虽然 Handler 在处理消息时会阻塞线程,但由于它是与 UI 线程关联的,所以在线程阻塞一段时间并不会导致 ANR。但是,如果在线程中执行耗时操作(如网络请求、数据库操作等),则会导致线程阻塞时间过长,从而触发 ANR。因此,在开发中需要注意避免在线程中执行耗时操作,以保证应用的响应性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值