什么会导致 Android ImageView 部分解码?
What would cause an Android ImageView to partially decode?
我正在尝试追踪一个我只能解释的错误,因为它好像我的 ImageView 中的图像没有完全解码 - 我看到了图像的顶部,但图像的其余部分绘制为纯白色。我附加了一个调试器,但没有看到任何错误消息输出,例如内存限制。这是我的 Activity:
的部分截图
我将一系列 ImageView 叠加在一起,就像一叠卡片。这是屏幕截图的注释,因此您可以看到为什么这是错误的:
如果我旋转我的设备,这会产生重新运行 onCreate 的效果,ImageView 会正确绘制。我正在使用 Square's picasso 库来管理下载和解码。我检查了代表图像的文件本身的文件系统,文件没有问题并且已完全下载。
我似乎每 10 次左右就能重现此行为 1 次,这足以给我的用户带来问题。
任何人都可以提出为什么会发生这种情况吗?我反驳的设备是 Nexus 5 运行 Android L,但我也在同事的设备 运行 Android 三星 Galaxy 4 上的 KitKat 上看到了这个。
郑重声明,我是 运行 picasso 2.4.0(2015 年 1 月 20 日的 Picasso 分支)。
关于毕加索的 post 描述了我的经历:
I get half photo and half white color, and sometimes I get only the white color. #836
线程中的一位评论者说:
remove the android:scaleType attribute and check to see if error still exists...I usually dont get that error when remove the scaleType attribute from a custom ImageView and use the fit() method in picasso which is reliable.
事实上,我在加载的 imageView 中包含了 "centerCrop" 的 "scaleType" 属性。我已经删除了这个属性以支持 .fit().centerCrop()
,此后就再也没有遇到过这个问题;如果我这样做,将更新此线程。
经过进一步审查,这是 germane comment from this thread:
I fixed with the below code in NetworkRequestHandler.java... When the network was broken, I think it will decode a half photo
当我在我的测试服务器上 return 编辑 JPEG 图像的一个子集而不是整个 JPEG 图像时,我能够 100% 重现这个问题。似乎只有 return 数据子集的断开的 HTTP 连接(或损坏的文件服务器)会触发此问题。我使用插入 Picasso 的自定义网络库(而不是 okhttp),我只是修改了该库以确保文件长度与服务器报告的内容长度相匹配,然后再存储和解码文件。
我正在尝试追踪一个我只能解释的错误,因为它好像我的 ImageView 中的图像没有完全解码 - 我看到了图像的顶部,但图像的其余部分绘制为纯白色。我附加了一个调试器,但没有看到任何错误消息输出,例如内存限制。这是我的 Activity:
的部分截图我将一系列 ImageView 叠加在一起,就像一叠卡片。这是屏幕截图的注释,因此您可以看到为什么这是错误的:
如果我旋转我的设备,这会产生重新运行 onCreate 的效果,ImageView 会正确绘制。我正在使用 Square's picasso 库来管理下载和解码。我检查了代表图像的文件本身的文件系统,文件没有问题并且已完全下载。
我似乎每 10 次左右就能重现此行为 1 次,这足以给我的用户带来问题。
任何人都可以提出为什么会发生这种情况吗?我反驳的设备是 Nexus 5 运行 Android L,但我也在同事的设备 运行 Android 三星 Galaxy 4 上的 KitKat 上看到了这个。
郑重声明,我是 运行 picasso 2.4.0(2015 年 1 月 20 日的 Picasso 分支)。
关于毕加索的 post 描述了我的经历:
I get half photo and half white color, and sometimes I get only the white color. #836
线程中的一位评论者说:
remove the android:scaleType attribute and check to see if error still exists...I usually dont get that error when remove the scaleType attribute from a custom ImageView and use the fit() method in picasso which is reliable.
事实上,我在加载的 imageView 中包含了 "centerCrop" 的 "scaleType" 属性。我已经删除了这个属性以支持 .fit().centerCrop()
,此后就再也没有遇到过这个问题;如果我这样做,将更新此线程。
经过进一步审查,这是 germane comment from this thread:
I fixed with the below code in NetworkRequestHandler.java... When the network was broken, I think it will decode a half photo
当我在我的测试服务器上 return 编辑 JPEG 图像的一个子集而不是整个 JPEG 图像时,我能够 100% 重现这个问题。似乎只有 return 数据子集的断开的 HTTP 连接(或损坏的文件服务器)会触发此问题。我使用插入 Picasso 的自定义网络库(而不是 okhttp),我只是修改了该库以确保文件长度与服务器报告的内容长度相匹配,然后再存储和解码文件。