当应用启动时,系统会自动为应用分配一个main Thread。也就是我们常说的UI线程,是为了处理组件绘制和组件分发。为了保证UI线程不被阻塞,保证组件不停止分发和绘制,android规定Ui线程阻塞5秒就会出现ANR。所以我们要开启新的线程进行处理后台任务。
进程的优先级分为五种,分别是:前台进程,可见进程,后台进程,服务进程,空进程。
1.Thread ---One shot tasks //短暂任务
new Thread(){
@Override
public void run() {
//do short task
}
};
2.Executor //执行多个线程任务
(1).自动分配线程池
线程数量
private ExecutorService mExecutorService = Executors.newCachedThreadPool();
(2).手动分配
线程池
线程数量
private ExecutorService mExecutorService = Executors.newFixedThreadPool(5);
(3).单线程池
private ExecutorService mExecutorService = Executors.newSingleThreadExecutor();
加入线程池:
mExecutorService.execute(new Runnable(){
@Override
public void run() {
//do task
}
});
3.Handler和Thread //用于处于UI交互
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
//update UI
}
};
new Thread(){
@Override
public void run() {
mHandler.obtainMessage().sendToTarget();
}
};
4.AsyncTask //处理比较长时间的后台任务
class MyAsyncTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
5.Service
为什么要用Service而不是Thread?
线程是运行在进程里的,一旦应用被关闭了,也就是说这个进程变成了空进程,那么就很容易被系统回收,如此我们将不能及时获取到最新的消息了。
6.IntentService
相当开启线程的service。
7.AsyncQueryHandler
8.Loader