入口
上篇總結(jié)了下Glide利用fm和一個(gè)空Fragment 進(jìn)行生命周期的管理褂删,這里繼續(xù)看load & into开伏。不多說(shuō)膀跌,上代碼
// 上篇分析了with,繼續(xù)看下 load & into
Glide.with(this).load("url").into(...);
- 1.1 load
public RequestBuilder<Drawable> load(@Nullable Object model) {
return asDrawable().load(model);
}
public RequestBuilder<Drawable> asDrawable() {
return as(Drawable.class);
}
// 實(shí)例一個(gè)RequestBuilder
public <ResourceType> RequestBuilder<ResourceType> as(Class<ResourceType> resourceClass) {
return new RequestBuilder<>(glide, this, resourceClass);
}
// RequestBuilder 構(gòu)造中的 requestManager
protected RequestBuilder(Glide glide, RequestManager requestManager,
Class<TranscodeType> transcodeClass) {
this.glide = glide;
this.requestManager = requestManager;
this.context = glide.getGlideContext();
this.transcodeClass = transcodeClass;
this.defaultRequestOptions = requestManager.getDefaultRequestOptions();
this.transitionOptions = requestManager.getDefaultTransitionOptions(transcodeClass);
this.requestOptions = defaultRequestOptions;
}
- 2.1 into
public Target<TranscodeType> into(ImageView view) {
// 主線程校驗(yàn)(涉及View刷新)
Util.assertMainThread();
// View 非空校驗(yàn)
Preconditions.checkNotNull(view);
RequestOptions requestOptions = this.requestOptions;
if (!requestOptions.isTransformationSet()
&& requestOptions.isTransformationAllowed()
&& view.getScaleType() != null) {
// 獲取圖片位置類(lèi)型
switch (view.getScaleType()) {
case CENTER_CROP:
requestOptions = requestOptions.clone().optionalCenterCrop();
break;
case CENTER_INSIDE:
requestOptions = requestOptions.clone().optionalCenterInside();
break;
case FIT_CENTER:
case FIT_START:
case FIT_END:
requestOptions = requestOptions.clone().optionalFitCenter();
break;
case FIT_XY:
requestOptions = requestOptions.clone().optionalCenterInside();
break;
case CENTER:
case MATRIX:
default:
// Do nothing.
}
}
return into(context.buildImageViewTarget(view, transcodeClass), requestOptions);
}
// 繼續(xù)看into
private <Y extends Target<TranscodeType>> Y into(@NonNull Y target, RequestOptions options) {
Util.assertMainThread();
Preconditions.checkNotNull(target);
if (!isModelSet) {
throw new IllegalArgumentException("You must call #load() before calling #into()");
}
options = options.autoClone();
// 根據(jù)target & options中的屬性 build 一個(gè) Request
Request request = buildRequest(target, options);
// target 與 request 綁定,這里復(fù)用之前的Request
Request previous = target.getRequest();
// 這里校驗(yàn)request 是否一致 previous
//一致就回收掉request
if (request.isEquivalentTo(previous)) {
request.recycle();
//這里的是校驗(yàn) previous 執(zhí)行情況固灵。
//begin內(nèi)部機(jī)制:
//如果正在運(yùn)行捅伤,會(huì)保證不中斷運(yùn)行
//如果完成則重新開(kāi)始并提交
//如果失敗,重新開(kāi)始
if (!Preconditions.checkNotNull(previous).isRunning()) {
previous.begin();
}
return target;
}
// 如果兩個(gè)request 不一致巫玻,則刪除舊的丛忆,更新requestManager中的tartget,requesr到set
requestManager.clear(target);
target.setRequest(request);
// requestManager 添加請(qǐng)求到 RequestTracker中 Set<Request>
requestManager.track(target, request);
return target;
}
- 2.2 上面不難看出新建的request通過(guò)requestManager 添加請(qǐng)求到 RequestTracker中祠汇,requestManager 維護(hù)了一個(gè)RequestTracker,可以做到根據(jù)生命周期來(lái)處理所有request
// 在生命周期回調(diào)中熄诡,對(duì)應(yīng)targetTracker不同處理
@Override
public void onStart() {
resumeRequests();
targetTracker.onStart();
}
@Override
public void onStop() {
pauseRequests();
targetTracker.onStop();
}
@Override
public void onDestroy() {
targetTracker.onDestroy();
for (Target<?> target : targetTracker.getAll()) {
clear(target);
}
targetTracker.clear();
requestTracker.clearRequests();
lifecycle.removeListener(this);
lifecycle.removeListener(connectivityMonitor);
mainHandler.removeCallbacks(addSelfToLifecycle);
glide.unregisterRequestManager(this);
}
- 3.1 RequestManager中可很,requestTracker做為RequestManager成員變量被創(chuàng)建和初始化,所有request都由RequestManager加到了requestTracker中來(lái)管理凰浮,并與生命周期掛鉤我抠。看下requestTracker
package com.bumptech.glide.manager;
import com.bumptech.glide.request.Request;
import com.bumptech.glide.util.Util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.WeakHashMap;
public class RequestTracker {
// 用set 防止未開(kāi)始或者onPause的時(shí)候被GC干掉
private final Set<Request> requests =
Collections.newSetFromMap(new WeakHashMap<Request, Boolean>());
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
private final List<Request> pendingRequests = new ArrayList<>();
private boolean isPaused;
/**
* Starts tracking the given request.
*/
public void runRequest(Request request) {
requests.add(request);
if (!isPaused) {
request.begin();
} else {
pendingRequests.add(request);
}
}
// Visible for testing.
void addRequest(Request request) {
requests.add(request);
}
/**
* Stops tracking the given request, clears, and recycles it, and returns {@code true} if the
* request was removed or {@code false} if the request was not found.
*/
public boolean clearRemoveAndRecycle(Request request) {
if (request == null) {
return false;
}
boolean isOwnedByUs = requests.remove(request);
// Avoid short circuiting.
isOwnedByUs = pendingRequests.remove(request) || isOwnedByUs;
if (isOwnedByUs) {
request.clear();
request.recycle();
}
return isOwnedByUs;
}
/**
* Returns {@code true} if requests are currently paused, and {@code false} otherwise.
*/
public boolean isPaused() {
return isPaused;
}
/**
* Stops any in progress requests.
*/
public void pauseRequests() {
isPaused = true;
for (Request request : Util.getSnapshot(requests)) {
if (request.isRunning()) {
request.pause();
pendingRequests.add(request);
}
}
}
/**
* Starts any not yet completed or failed requests.
*/
public void resumeRequests() {
isPaused = false;
for (Request request : Util.getSnapshot(requests)) {
if (!request.isComplete() && !request.isCancelled() && !request.isRunning()) {
request.begin();
}
}
pendingRequests.clear();
}
/**
* Cancels all requests and clears their resources.
*
* <p>After this call requests cannot be restarted.
*/
public void clearRequests() {
for (Request request : Util.getSnapshot(requests)) {
clearRemoveAndRecycle(request);
}
pendingRequests.clear();
}
/**
* Restarts failed requests and cancels and restarts in progress requests.
*/
public void restartRequests() {
for (Request request : Util.getSnapshot(requests)) {
if (!request.isComplete() && !request.isCancelled()) {
// Ensure the request will be restarted in onResume.
request.pause();
if (!isPaused) {
request.begin();
} else {
pendingRequests.add(request);
}
}
}
}
@Override
public String toString() {
return super.toString() + "{numRequests=" + requests.size() + ", isPaused=" + isPaused + "}";
}
}
-
3.2 以上看出RequestTracker對(duì)所有Requst進(jìn)行對(duì)應(yīng)生命周期的維護(hù)
- 比如onPause時(shí)袜茧,對(duì)所有Request暫停菜拓,加入set
- onResume 時(shí),對(duì)所有Request 進(jìn)行restart
- onStop 時(shí)笛厦,clear all Request
一波666
總結(jié)
- 主要對(duì)所有Request 進(jìn)行隊(duì)列維護(hù)纳鼎,并在生命周期回調(diào)中進(jìn)行相應(yīng)優(yōu)化
- 梳理了一下,看圖比較直接
[圖片(https://github.com/jfson/ImgResource/blob/master/25.png?raw=true)]