【发布时间】:2014-11-26 10:34:34
【问题描述】:
Github 中有许多流行的图像加载器可用于图像加载和缓存以及管理图像请求。
- 通用图像加载器
- 凌空抽射
- Picasso
- 壁画(添加enhancement)
我遇到了要求,如果 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 中非常重要
【问题讨论】:
-
我认为与其在 60% 之前或最多 60% 之前取消请求,不如尝试一次缓存图像并在单词之后使用它,这样与取消请求相比,它可能需要更少的互联网使用量,并且在需要新获取相同图像时再次使用是的,您尝试使用 AndroidQuery 进行异步图像加载,而不是这三个库:code.google.com/p/android-query
-
请求是网络调用,不是缓存图片。
-
是的,我知道,但是如果不缓存图像一次,那么它将每次都从网络加载,并且根据您的要求,如果图像请求没有获得 75% 字节数据,它将被浪费,因此间接浪费网络使用情况。
-
Hey Haresh Caching 适用于所有图像加载库。所以我不关心缓存。我的观点是,当第一个请求发出时,它应该在分离时取消之前进行检查,并且用户继续频繁地来回滚动,然后在中间状态下也会生成和取消很多请求。
标签: android android-volley universal-image-loader picasso image-load