a284628487 / AndroidPoint

Android Note
1 stars 0 forks source link

Better performance through threading #2

Open a284628487 opened 6 years ago

a284628487 commented 6 years ago

https://developer.android.com/topic/performance/threads

a284628487 commented 6 years ago

熟练使用线程可以提高应用程序的性能。

Main thread

当用户打开app,Android创建一个新的进程以及一个执行线程,该线程就是主线程,用于处理所有发生在屏幕上的事件。

Internals

主线程的工作就是不断的从一个线程安全的队列中获取任务并且执行。 当屏幕内容发生改变或者产生动画时,系统尝试每16ms刷新一次页面,这期间会执行一系列的任务。 如果此时消息队列中包含大量的任务或者有耗时的任务,以致于在16ms内不能完成所有的任务,则应该把这些任务添加到工作线程。Android系统屏幕刷新频率16ms(60帧每秒),如果在16ms内不能把这些任务执行完成,则App会产生卡顿。

Explicit references

避免线程中直接引用View,当Activity被销毁之后,线程如果还在执行状态,则线程还在引用着View,导致Activity不能被及时回收。

Implicit references

非静态内部类实例,会自动引用外部类,同样的,如果Activity被销毁,但是内部类未被销毁,也会导致Activity的回收延迟。

Thread persist

如果一个任务获取数据并更新页面,则在页面销毁之后,该任务则不需要留存。 如果一个任务获取数据并缓存数据到本地,然后再去更新页面,则在页面销毁之后,该任务也可以留存下来,继续执行下载和缓存的工作。

Thread priority

不同的线程优先级,获取到CPU执行权的比重不同,当创建一个线程时,最好使用setThreadPriority()方法指定线程优先级, 前台线程大概获取到CPU 95%的执行权,而后台线程获取5%的执行权。 THREAD_PRIORITY_DEFAULT,THREAD_PRIORITY_BACKGROUND, THREAD_PRIORITY_LESS_FAVORABLE,THREAD_PRIORITY_MORE_FAVORABLE

HanlerThread class

持续运行的单线程。

ThreadPolExecut class

每个线程至少占用64k的内存,注意使用合适的线程池数量。