如果视图已被回收,毕加索是否理解不加载是否绝对正确?

时间:2014-09-09 13:48:32

标签: android lazy-loading picasso async-loading

我有点困惑:作为规则,当异步将图像加载到某种列表视图(无论是在Android还是iOS上,还是在另一个平台上的摘要中)时,你基本上必须这样做。

-- make a note of "which" cell this is (say, #213)
-- start getting the image from the net.
-- it has loaded from the net. What cell are we now?
-- if we are "still" 213, load the image to the image view!
-- if we are "no longer" 213, just forget about it.

这是延迟加载异步图像的基础。例如,Lucas Rocha在一篇着名的文章中完美地解释了它:

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

(向下滚动到“这里只是一个简单的草图,你可以做到这一点:”......)

现在好了,据我所知毕加索实际上已经完全自动为你做了这件事。

毕加索“知道”视图是否已经改变。如果视图发生了变化,毕加索知道不要加载它

我完全正确吗?这是毕加索的内置功能,我还需要做什么呢?

(旁边 - 我有点困惑“毕加索如何做到这一点;瞥了一眼我在毕加索看不到任何魔法代码,它记录了id,或者持有者的某些东西?查看? 。)


为了清楚起见,我正在以通常的方式使用Picasso,就像这样,基本上是在getView的末尾......

Picasso.
  with(State.mainContext).
  load(imageFile.getUrl()).
  placeholder(R.drawable.default).
  noFade().
  into(v.hexaIV);

1 个答案:

答案 0 :(得分:4)

是的,Picasso真是太美了。在getView()方法Picasso.with(c).load(url).into(img);

中只需要一行

他们是如何做到的,我不确定,但在Picasso存在之前,我做了自己的图像加载器并且它并不那么困难。

假设您在图片加载器代码中的某处有Url和ImageView地图。

因此,只要代码将img传递给它,它就会检查此映射,如果它已经使用基本Java img加载了相同mImg.equals(img)的其他URL,如果它匹配,它知道,即使你仍然会缓存该URL,它也不应该将Drawable传递给ImageView。

在一些罕见的情况下,您可能希望直接取消加载,在这些情况下,您可以致电Picasso.with(c).cancel(img);,但这种情况很少见。