问题一:Android 中子线程真的不能更新 UI 吗?

参考回答:
在 onCreate() 方法中创建的子线程访问 UI 是一种极端的情况,程序不会崩溃。由于
ViewRootImpl 还没有创建,所以无法检测当前线程是否为 UI 线程。

  • ViewRootImpl 的创建是在 onResume() 方法回调之后。
  • ViewRootImpl 是在 WindowManagerGlobal 的 addView() 方法中创建的。

问题二:Android 中为什么主线程不会因为 Looper.loop() 里的死循环卡死?

参考回答:

  • 进程:每个app运行时前首先创建一个进程,该进程是由 Zygote fork 出来的,用于承载 App 上运行的各种 Activity/Service 等组件。进程对于上层应用来说是完全透明的,这也是google有意为之,让App程序都是运行在Android Runtime。大多数情况一个App就运行在一个进程中,除非在AndroidManifest.xml中配置Android:process属性,或通过native代码fork进程。
  • 线程:线程对应用来说非常常见,比如每次new Thread().start都会创建一个新的线程。该线程与App所在进程之间资源共享,从Linux角度来说进程与线程除了是否共享资源外,并没有本质的区别,都是一个task_struct结构体,在CPU看来进程或线程无非就是一段可执行的代码,CPU采用CFS调度算法,保证每个task都尽可能公平的享有CPU时间片。
  • 对于线程既然是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出,例如,binder 线程也是采用死循环的方法,通过循环方式不同与 Binder 驱动进行读写操作,当然并非简单地死循环,无消息时会休眠。但这里可能又引发了另一个问题,既然是死循环又如何去处理其他事务呢?通过创建新线程的方式。真正会卡死主线程的操作是在回调方法onCreate/onStart/onResume 等操作时间过长,会导致掉帧,甚至发生 ANR,looper.loop本身不会导致应用卡死。

问题三:Binder、IBinder、IInterface 的关系

参考回答:

  • Binder:概念意义的 Binder,和一个 BinderProxy 对象相关联;
  • IBinder:一个接口,Binder类实现了它,是 Binder 的抽象;
  • IInterface:一个接口,AIDL 接口必须继承它;

更多相关文章

  1. Android(安卓)驱动跟系统开发 1. 一个简单的例子
  2. Android(安卓)中的 Service 全面总结
  3. android studio配置系列 - 收藏集 - 掘金
  4. activity 生命周期
  5. android bionic缺失pthread_cancel的解决方法
  6. 移动端开发新趋势Flutter
  7. android eclipse xml不自动代码提示
  8. Android(安卓)service与Thread
  9. android 自定义RadioButton样式

随机推荐

  1. android 2.3 开始主线程不能访问网络
  2. 关于android的des算法代码
  3. Android设置Dialog设置圆角
  4. Fragment传值到Fragment的操作步骤
  5. android WiFi 开关代码
  6. android中的webview进度条
  7. MySQL DISTINCT 的基本实现原理详解
  8. MySql 8.0.16版本安装提示已经不使用“UT
  9. mysql 8.0.16 winx64及Linux修改root用户
  10. Mysql解决数据库N+1查询问题