android实现多线程的几种方式:
Activity.runOnUiThread(Runnable)
是UI线程就马上执行,不是UI线程,就以发送消息的方式去做处理
/**
* Runs the specified action on the UI thread. If the current thread is the UI
* thread, then the action is executed immediately. If the current thread is
* not the UI thread, the action is posted to the event queue of the UI thread.
*
* @param action the action to run on the UI thread
*/
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
做一个消息的封装和发送
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
View.post(Runnable) ;View.postDelay(Runnable , long)
内部通过AttachInfo里面的handler发送消息
public boolean post(Runnable action) {
final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
return attachInfo.mHandler.post(action);
}
// Assume that post will succeed later
ViewRootImpl.getRunQueue().post(action);
return true;
}
handler里面的post方法
public final boolean post(Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}
这个方法和postDelay方法一致了,间隔时间变成了0
public final boolean sendMessageDelayed(Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
Handler
There are two main uses for a Handler:
(1) to schedule messages and runnables to be executed as some point in the future
调度一些消息或者可执行动作确保可以在某一刻能够执行
(2) to enqueue an action to be performed on a different thread than your own.
将一些执行队列放在不同线程中执行
handler运行在主线程中间