Github中有许多流行的Image loader可用于图像加载和缓存以及管理图像请求。
我遇到了如果 Imageview 如果不再附加到窗口请求(批次和航班)将被取消的要求。
然而, Listview 和 Gridview Imageview 之类的滚动窗口小部件经常被附加到窗口并从窗口分离,因此队列中的请求分别被取消
我担心的是他们没有机制来跟踪上面所有库中图像请求的进度。如果 Imageview 被分离,请求应该根据进度被取消,如果字节流有已完成75%的工作然后不应该取消,这反过来会减少网络带宽并减少网络呼叫,因为通常用户总是在滚动窗口小部件中滚动很多,如 Listview 和 Gridview 等..
以下是我对Volley的理解:
public boolean removeContainerAndCancelIfNecessary(ImageContainer container) {
/* logic to check progress of Request */
mContainers.remove(container);
if (mContainers.size() == 0) {
mRequest.cancel();
return true;
}
return false;
}
以下是我对毕加索的理解:
private void cancelExistingRequest(Object target) {
checkMain();
Action action = targetToAction.remove(target);
if (action != null) {
action.cancel();
dispatcher.dispatchCancel(action);
}
if (target instanceof ImageView) {
ImageView targetImageView = (ImageView) target;
DeferredRequestCreator deferredRequestCreator = targetToDeferredRequestCreator.remove(targetImageView);
if (deferredRequestCreator != null) {
deferredRequestCreator.cancel();
}
}
}
以下是我对Universal Image Loader的理解: 我没想到通用图像加载器允许取消内联请求。
void cancelDisplayTaskFor(ImageAware imageAware) {
cacheKeysForImageAwares.remove(imageAware.getId());
}
请告诉我仅针对网络请求解决此问题的可能性。如果图像已经缓存,那么我们将取消该请求。
电池性能在Android中非常重要
答案 0 :(得分:2)
我不能说Volley和毕加索,但我可以说UIL是如何运作的。
UIL在任务处理期间不断检查ImageView。如果任务变为非实际(ImageView被回收(重用)或由GC收集),则UIL将停止此ImageView的任务。
如果在下载图像时任务变为非实际情况怎么样?如果下载的图像数据少于75%,UIL将中止下载。如果超过75% - 则UIL完成下载(即UIL在磁盘缓存中缓存图像文件),然后取消任务。