Android 彻底掌握 Handler 看这里就够了,flutter下载文件

}

msg.recycleUnchecked();

}

}

上面代码表示 loop 方法中执行了一个死循环,这也是一个 Android App 进程能够持续运行的原因。

注释1:不断地调用 MessageQueue 的 next 方法取出 Message。

注释2:如果 message 不为 null,则处进行后续处理。具体就是从 Message 中取出 target 对象,然后调用其 dispatchMessage 方法处理 Message 自身。target是谁?

Message.target

public final class Message implements Parcelable {

@UnsupportedAppUsage

@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)

public long when;

/package/ Bundle data;

@UnsupportedAppUsage

/package/ Handler target;

@UnsupportedAppUsage

/package/ Runnable callback;

// sometimes we store linked lists of these things

@UnsupportedAppUsage

/package/ Message next;

/** @hide */

public static final Object sPoolSync = new Object();

private static Message sPool;

private static int sPoolSize = 0;

}

查看后其实就是个Handler。那咱们再看看Handler 的 dispatchMessage 方法

Handler.dispatchMessage()

/**

* Handle system messages here.

* 在这里处理系统消息。

*/

public void dispatchMessage(@NonNull Message msg) {

if (msg.callback != null) {

handleCallback(msg);

} else {

if (mCallback != null) {

if (mCallback.handleMessage(msg)) {

return;

}

}

handleMessage(msg);

}

}

/**

* Subclasses must implement this to receive messages.

* 子类必须实现它才能接收消息。

*/

public void handleMessage(@NonNull Message msg) {

}

可以看出,在 dispatchMessage 方法中会调用一个空方法 handleMessage,而这个方法也正是我们创建 Handler 时需要覆盖的方法。那么 Handler 是何时将其设置为一个 Message 的 target 的呢?

Handler.sendMessage()


Handler 有几个重载的 sendMessage 方法,但是基本都大同小异。咱使用最普通的 sendMessage 方法来分析,代码具体如下:

public final boolean sendMessage(@NonNull Message msg) {

return sendMessageDelayed(msg, 0);

}

Handler.sendMessageDelayed()

public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {

if (delayMillis < 0) {

delayMillis = 0;

}

return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);

}

Handler.sendMessageAtTime()

public boolean sendMessageAtTime(@NonNull 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);

}

经过几层调用之后,在这里我们拿到了在 ActivityThread 的 main 方法中通过 Looper 创建的 MessageQueue。

<

你可能感兴趣的:(程序员,面试,android,移动开发)