如何确定非同步图像加载渲染的android视图

如何确定非同步图像加载渲染的android视图,android,android-layout,android-activity,android-view,picasso,Android,Android Layout,Android Activity,Android View,Picasso,编辑2014年3月12日:发布了几周,但没有活动。我的问题清楚吗?或TL;博士不幸的是,由于我是新会员,我不能提供赏金:-( 我的问题可以概括为: 我如何确定包含异步加载元素(如web图像)的视图何时已完全加载并呈现,而无需借助一点技巧—请参见下文 是否有一种确定的方法可以确定视图何时完成加载,而不必简单地为View.postDelayed()使用较长的防御延迟值 如果您认为您能提供帮助,请继续阅读本问题的背景和细节 问题背景 我正在利用我的应用程序中的第三方库尝试执行以下操作: 第三方库通

编辑2014年3月12日:发布了几周,但没有活动。我的问题清楚吗?或TL;博士不幸的是,由于我是新会员,我不能提供赏金:-(

我的问题可以概括为:

  • 我如何确定包含异步加载元素(如web图像)的视图何时已完全加载并呈现,而无需借助一点技巧—请参见下文
  • 是否有一种确定的方法可以确定视图何时完成加载,而不必简单地为
    View.postDelayed()
    使用较长的防御延迟值
如果您认为您能提供帮助,请继续阅读本问题的背景和细节

问题背景 我正在利用我的应用程序中的第三方库尝试执行以下操作:

  • 第三方库通过RESTAPI异步加载一些数据
  • 库处理JSON数据并用于下载JSON响应中包含的图像URL,然后将它们加载到自定义的
    视图中(库视图,而不是我的视图),然后显示在我的
    活动中。
    
    • 注意:Picasso调用由我使用的库封装,第三方库选择不使用Picasso提供的回调,该回调指示图像加载的时间。当底层JSON请求成功返回时,我只能访问回调
  • 一旦自定义
    视图
    加载并完全呈现,我想将此
    视图
    保存为PNG格式
  • 我的问题出现在第3步:我无法确定地检测自定义
    视图何时完成加载,以便在视图完全渲染后保存PNG。毕加索根据设计,将图像异步加载到android
    视图
    对象中,我想这就是我尝试的方法下面的ted没有工作:

  • 使用
    GlobalLayoutListener
    确定视图按建议完成加载的时间

    myView.getViewTreeObserver().addOnGlobalLayoutListener(新OnGlobalLayoutListener(){
    @凌驾
    公共图书馆{
    //尝试在此处开始保存PNG
    savePNG();
    });
    
    • 这不起作用,因为
      onGlobalLayout()
      根据图像在背景中加载的速度,会在
      视图
      完全渲染之前触发不可预测的次数
    • 我在
      onGlobalLayout()
      中使用了
      View.postDelayed(Runnable,delay)
      ,但是,同样,由于设备功率和网络带宽,再加上它引入了某种竞争条件,不可能知道延迟应该有多长
  • 许多关于SO的类似问题的答案都建议只发布
    savePNG()
    作为UI消息队列上的可运行程序。我认为这在大多数情况下都很好,但在通过internet将图像异步加载到视图中时就不行了。大多数情况下,这种方法会导致在视图完全加载和呈现之前尝试保存图像。当然,我可以
    postdayed
    ,但这会导致ame延迟长度和竞争条件的不确定性与前一点相同

  • 我试图等待
    MessageQueue.IdleHandler.queueIdle()
    事件执行
    savePNG()
    ,但遗憾的是,在加载和呈现所有资源之前,这种情况也会发生

  • 保持上次调用
    onGlobalLayout
    的时间,并让另一个线程定期检查“XXX毫秒内无更新”,以确定视图已稳定下来。这不是一个很好的解决方案,可能会使应用程序显得不必要的慢,但我至少可以让它工作

  • 我尝试对
    视图进行子分类
    并覆盖
    dispatchDraw()
    (建议)并调用回我的应用程序-与
    onGlobalLayout
    相同的问题-在视图完全加载和呈现之前,会触发多次


  • 哇,很长的帖子,但希望这意味着如果有一个非常明显的“抓到”一直盯着我看的话,我就不会看起来这么傻了:-)

    创建一个自定义视图的子类,它只覆盖
    setImageBitmap()
    setImageDrawable()
    方法。然后,您可以在子类中创建自己的侦听器接口和注册API。现在,当毕加索设置图像时,您可以回调已注册的侦听器使用
    位图
    可绘制
    。别忘了调用超类,以便图像实际应用于自定义视图。

    下载完整图像后,我们将位图应用于imageview,我认为了解下载状态就足够了,但对于毕加索,我可以建议快速建议,即查看毕加索jar wi在jd gui中,您可以找到您的情况和解决方案。很抱歉,我之前没有向您反映这一点-不知何故错过了关于我问题的活动!最后-是的-这与我得出的结论相同:对自定义
    视图进行子类化
    ,覆盖了他们调用毕加索的区域,并实现了我自己对pare的回调nt应用程序。将您的回答标记为答案,干杯。