1.Runnable
Runnable是一个接口,被Thread继承:
public interface Runnable { public void run(); } |
2.Thread
线程,继承了Runnable.在调用start()时,会调用底层的VMThread.create真正创建线程,然后执行run()函数.一个线程只能启动一次.
3.Looper
用于执行线程的消息循环,是一个循环体,它封装了一个消息队列,当收到消息时,它会调用消息的Handler进行处理.Looper的相关方法:
public static void prepare(); //创建一个Looper,并将对像保存到线程本地存储空间.
public static Looper myLooper();//获取线程本地存储空间的Looper对像.
public static void loop() ;// 进入消息循环,这是一个for(;;)循环
public static MessageQueue myQueue(); //返回Looper的消息队列
4.Handler
Handler是一个处理者,创建时可以指定或不指定它的Looper,如果不指定那它会使用当前线程的Looper对像.Handler提供两个功能,一个是提供dispatchMessage函数,另一个是提供投递消息的功能.基本的方法是使用Handler向它的Looper投递消息,当Looper收到消息时就会调用Handler的dispatchMessage函数.
dispatchMessage优先调用消息的回调函数,如果消息没有提供回调,就调用构建时设置的回调函数,如果在构建时也没有设置回调函数或者构建的回调函数没有处理消息,那么就调用Handler类的handleMessage方法.代码如下:
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } |
5.Thread,Looper,Handler的配合使用:
class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } } |
6.HandlerThread
看起来是Thread和Handler的联合,但是其实是Thread和Looper的联合,它创建一个线程和一个Looper,并且可以指定优先级.可以跟据它的Looper创建Handler,然后使用Handler给线程发消息,让线程做事.适用于需要重复执行的任务.
7.AsyncTask
异步任务,适用于很短时间的异步操作,比如几秒内.AsyncTask需要被子类继承使用,子类必须实现doInBackground函数,一般会实现onPostExecute来检查执行结果.AsyncTask建立了一个静态的线程池对像,会按顺序执行所有的AsyncTask.示例:
private class DownloadFilesTask extends AsyncTask(URL, Integer, Long) { protected Long doInBackground(URL... urls) { //在线程池里执行 int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) {//在创建AsyncTask的线程中执行 setProgressPercent(progress[0]); } protected void onPostExecute(Long result) {//在创建AsyncTask的线程中执行 showDialog("Downloaded " + result + " bytes"); } } |