【译】使用标签实现图像加载的分组管理

Picasso的标签概念

在上一篇博客中,你已经了解了如何为特定的图像请求分配优先级。因为你可能在同一时刻取消,暂停或者恢复多个图像请求,因此之前的那些技巧或许不能完全满足你的要求。如果你的视图变化很快,那么对于取消较早的图像加载,已经离开屏幕的,以及为新的视图开启图像加载来说是非常有用的。幸运的是,Picasso提供了.tag()函数,用来实现这些需求。

.tag(Object object)可以传入任何java对象作为参数。因此,你可以基于任何逻辑来建立你的图像请求组。关于图像加载分组,需要关注以下几点:

  • 使用.pauseTag()暂停请求
  • 使用.resumeTag()恢复请求
  • 使用.cancelTag()取消请求

基本来讲,无论何时,你需要取消或者暂停一个甚至多个图像加载时,首先应该为这些Picasso请求添加标签,然后调用合适的方法。这听起来可能有些抽象,让我们看一些示例吧。

示例#1:.pauseTag()和.resumeTag()

这个示例演示了如何在一个标准的ListView中使用标签。让我们想象一个收件箱的ListView,用来展示收到的消息以及发送者。发送者通过他们的头像来呈现。

试想如下场景:用户正在寻找一个过时的消息,并且快速的向上翻滚列表。ListView的自身设计能够快速的对条目进行回收和重用。如果实现了正确的adapter,那么用户体验将非常顺滑。然而,由于用户滑动速度太快,Picasso一次又一次的尝试为每个单元条目启动图像加载请求,然后又不得不立刻取消该加载请求。

更有效的方式应该是暂停所有的图像加载,直到停止滚动。用户不会感受到任何不同,但应用却大大减少了请求数量。

实现起来也非常简单。首先,为Picasso请求添加标签:

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .tag("Profile ListView") // can be any Java object
    .into(imageViewWithTag);

其次,实现一个AbsListView.OnScrollListener接口,并重写onScrollStateChanged()函数:

@Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    final Picasso picasso = Picasso.with(context);

    if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
          picasso.resumeTag(context);
    } else {
          picasso.pauseTag(context);
    }
  }

最后,设置这个监听回调到ListView上:

ListView listView = ... // e.g. findById()
listView.setOnScrollListener(onScrollListener);

ListView处于SCROLL_STATE_FLING状态时,暂停所有的请求。如果ListView处于SCROLL_STATE_IDLE或者SCROLL_STATE_TOUCH_SCROLL状态,再恢复这些请求。

以上示例中的代码,摘自于Picasso官方实例工程

示例#2:cancelTag()

上面所涉及的ListView代码示例,并没有使用到cancelTag()函数。让我们试想另一个场景。你实现了一个购物车,以图片条目的形式来展示所有被选中的商品。一旦用户点击“结算”按钮,立即弹出ProgressDialog并向服务器发送请求来验证本次事务的有效性。当用户点击“结算”后,之前的条目列表有一部分会被隐藏。因此,没有什么理由让图像持续加载,从而为网络,电量和内存等增加无谓的负担。

我们可以在显示ProgressDialog之后,通过调用.cancelTag()来优化这种行为。

public void buyButtonClick(View v) {
    // display ProgressDialog
    // ...

    // stop image requests
    Picasso
        .with(context)
        .cancelTag("ShoppingCart");

    // make 'buy'-request to server
    // ...
}

总结与提醒

上面提到的两个示例只不过是标签功能的冰山一角。你可能需要各式各样的对象来作为标签,这完全取决于你的用例场景。这篇博客中使用的标签类型是String,但是不局限于此,你完全可以使用任何类型。有些时候可能会使用Context(或Activity)作为标签,理论上来讲这是允许的,但是我们应该牢记一下这段摘自官方javaDocs的提醒:

Picasso will keep a reference to the tag for as long as this tag is paused and/or has active requests. Look out for potential leaks.

换言之,如果用户离开了一个已经暂停了Picasso请求的Activity,那么GC可能无法回收这个Activity实例。这就造成了内存泄露。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 炙热灼烧 忘记自尊 忘记所有 和他融为一体 爱到粉身碎骨 今天是我的葬礼
    我是你饱饱阅读 97评论 0 0
  • 2017年7月23日,记录有趣的读书生活第77天。 周日上午依然舞蹈课,原本10点结束的课程,...
    爱和阅读阅读 308评论 0 0
  • 你有没有很喜欢过一个人,喜欢到不行?你喜欢他,很久了。等他,也很久了。可是,他还是不喜欢你,永远也不会喜欢你。 0...
    云亦暖阅读 1,034评论 25 12