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

记录一下学习历程。

这里以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

酌情进行选择!!!

你可能感兴趣的:(Android性能优化)