Android编程规范摘要4 (进程、线程与消息通信)

进程、线程与消息通信


其它相关文章:
Android编程规范摘要1 (资源文件命名与使用)
Android编程规范摘要2 (基本组件)
Android编程规范摘要3 (UI与布局)
Android编程规范摘要4 (进程、线程与消息通信)
Android编程规范摘要5 (文件与数据库)
Android编程规范摘要6 (Bitmap、Drawable 与动画)
Android编程规范摘要7 (安全)


  1. [强制] 不要通过Intent 在Android 基础组件之间传递大数据(binder transaction缓存为1MB),可能导致OOM。
  2. [强制] 在Application的业务初始化代码加入进程判断,确保只在自己需要的进程初始化。特别是后台进程减少不必要的业务初始化。

    • 正例:
      public class MyApplication extends Application {
          @Override
          public void onCreate() {
              //在所有进程中初始化
              ....
              //仅在主进程中初始化
              if (mainProcess) {
              ...
              }
              //仅在后台进程中初始化
              if (bgProcess) {
              ...
              }
          }
      }
  3. [强制] 新建线程时,必须通过线程池提供(AsyncTask 或者ThreadPoolExecutor或者其他形式自定义的线程池),不允许在应用中自行显式创建线程。

    • 使用线程池,可以:

      • 减少在创建和销毁线程的时间开销
      • 减少在创建和销毁线程的系统开销,防止资源不足的问题
    • 创建单个线程的后果:

      • 可能造成系统创建大量同类线程,将会大量消耗内存,并可能存在“过度切换”问题
      • 如果创建匿名线程,将不便于后续的资源使用分析,对性能分析等会造成困扰。
  4. [强制] 线程池不允许使用Executors 去创建,而是通过ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

    • Executors 返回的线程池对象的弊端
      • FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM;
      • CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
    • 正例

      int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
      int KEEP_ALIVE_TIME = 1;
      TimeUnit KEEP_ALIVE_TIME_UNIT = TimeUnit.SECONDS;
      BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>();
      ExecutorService executorService = new ThreadPoolExecutor(NUMBER_OF_CORES, 
          NUMBER_OF_CORES*2, 
          KEEP_ALIVE_TIME, 
          KEEP_ALIVE_TIME_UNIT,
          taskQueue, 
          new BackgroundThreadFactory(), 
          new DefaultRejectedExecutionHandler());
    • 反例

      ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  5. [强制] 子线程中不能更新界面,更新界面必须在主线程中进行,网络操作不能在主线程中调用。

  6. 尽量 减少不同APP 之间的进程间通信及拉起行为。拉起导致占用系统资源,影响用户体验。**

    • 我们当然懂这个,但这是黑色幽默。
    • 因为Android毒瘤淘宝及支付宝APP。
  7. 新建线程时,定义能识别自己业务的线程名称,便于性能优化和问题排查。

    • 正例
      public class MyThread extends Thread {
          public MyThread(){
              super.setName("ThreadName");
              …
          }
      }
  8. ThreadPoolExecutor 设置线程存活时间(setKeepAliveTime),确保空闲时线程能被释放。

  9. 禁止在多进程之间用SharedPreferences 共享数据, 虽然可以 (MODE_MULTI_PROCESS),但官方已不推荐。

  10. 谨慎使用Android 的多进程,多进程虽然能够降低主进程的内存压力,但会遇到如下问题:

    • 首次进入新启动进程的页面时会有延时的现象,黑屏或白屏几秒。
    • 应用内多进程时,Application 实例化多次,需要考虑各个模块是否都需要在所有进程中初始化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值