如何确定非同步图像加载渲染的android视图
编辑2014年3月12日:发布了几周,但没有活动。我的问题清楚吗?或TL;博士不幸的是,由于我是新会员,我不能提供赏金:-( 我的问题可以概括为:如何确定非同步图像加载渲染的android视图,android,android-layout,android-activity,android-view,picasso,Android,Android Layout,Android Activity,Android View,Picasso,编辑2014年3月12日:发布了几周,但没有活动。我的问题清楚吗?或TL;博士不幸的是,由于我是新会员,我不能提供赏金:-( 我的问题可以概括为: 我如何确定包含异步加载元素(如web图像)的视图何时已完全加载并呈现,而无需借助一点技巧—请参见下文 是否有一种确定的方法可以确定视图何时完成加载,而不必简单地为View.postDelayed()使用较长的防御延迟值 如果您认为您能提供帮助,请继续阅读本问题的背景和细节 问题背景 我正在利用我的应用程序中的第三方库尝试执行以下操作: 第三方库通
- 我如何确定包含异步加载元素(如web图像)的视图何时已完全加载并呈现,而无需借助一点技巧—请参见下文
- 是否有一种确定的方法可以确定视图何时完成加载,而不必简单地为
使用较长的防御延迟值View.postDelayed()
视图中(库视图,而不是我的视图),然后显示在我的活动中。
- 注意:Picasso调用由我使用的库封装,第三方库选择不使用Picasso提供的回调,该回调指示图像加载的时间。当底层JSON请求成功返回时,我只能访问回调
视图
加载并完全呈现,我想将此视图
保存为PNG格式视图何时完成加载,以便在视图完全渲染后保存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应用程序。将您的回答标记为答案,干杯。