HelloWorld


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 其他

EZLippi-浮生志

Android 性能优化之异步启动(ExecutorService)

发表于 2019-07-12 18:56:45 | 分类于 Android | 点击量 788 ℃

 

记录一下学习历程。

这里以Application类为例。

我们有三个耗时启动操作,如果将它放置在Oncreate中,那无疑是会增加我们的启动时间,原因是假如设备为四核,那可能分配给我们的就只有两个,相当于是本来有四个人可以工作,但是现在有两人干了四个人的活,因此会增加时间成本,同时对CPU的利用率也不高。

那此时我们可以通过线程池来进行提升效率(ExecutorService),关于ExecutorService原理等内容可自行百度,这里只做用法参考和效率展示。

package com.tanbo.rocery_store;
 
import android.content.Context;
import android.os.AsyncTask;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;
 
import com.myi.tools.TBTools;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class APPAplication extends MultiDexApplication {
 
 @Override
 protected void attachBaseContext(Context base) {
  super.attachBaseContext(base);
  MultiDex.install(this);
 }
 
 //这里的代码是拿的AsyncTask的源码,作用是创建合理可用的线程池容量
 private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
 private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
 
 private ExecutorService executorService;
 @Override
 public void onCreate() {
  super.onCreate();
 
  TBTools.init(this);
  TBTools.openToolsLog(true);
  long startTime = System.currentTimeMillis();
 
  executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);
  executorService.execute(new Runnable() {
   @Override
   public void run() {
    test1();
    TBTools.log().i("task","test1 over");
   }
  });
  executorService.execute(new Runnable() {
   @Override
   public void run() {
    test2();
    TBTools.log().i("task","test2 over");
   }
  });
  executorService.execute(new Runnable() {
   @Override
   public void run() {
    test3();
    TBTools.log().i("task","test3 over");
   }
  });
 
  TBTools.log().i("StartTime","Application oncreate end >>>"+(System.currentTimeMillis()-startTime));
 }
 
 public void test1(){
  for (int i = 0; i <10000000 ; i++) {
 
  }
 
 }
 public void test2(){
  for (int i = 0; i <10000000 ; i++) {
 
  }
 }
 public void test3(){
  for (int i = 0; i <10000000 ; i++) {
 
  }
 }
 
 
}
代码中,我们创建了一个线程池,然后分别执行了三个耗时方法,运行结果:


再贴个未使用线程池的运行运行结果:


可见差距有多大,当然如此大的耗时操作,在编写代码之处我们就会使用子线程来操作,但是管理的问题就会油然而生,但是为什么这里不用new Thread直接干,原因可谷歌百度。

假如启动过程中存在依赖关系,比如必须test3执行完才进行下一步,则可使用CountDownLatch来进行等待。

这里看出通过线程池,我们将启动操作进行优化,缩短了启动时间,这个过程中,我们也可以通过Systrace等监测工具去观察CPU的使用情况,基本上是在合理范围之内,这里就不去进行此展示。

-------------------------------------------------------------------------------------------------------------------------------------------------

以上是线程池的操作,当然还有更优的解决方案:https://blog.csdn.net/Hello___Sunshine/article/details/93716138

酌情进行选择!!!

  • 本文作者: tanbo
  • 本文标题: Android 性能优化之异步启动(ExecutorService)
  • 本文链接: /blog/articles/51
  • 发布时间: 2019-07-12 18:56:45
< Android性能优化之启动方法总结
Android 性能优化之资源图  >
EZLippi

Tanbo

From Sichuan
Android开发工程师

29 日志
6 分类
6 标签
头像
评论 0
暂无评论
© 2019 - 2020 HelloWorld
由 Hexo 强力驱动
主题 - NexT.Mist | Hosted by Coding Pages