android.support.v7.graphics.Palette宽度和高度必须为>;0

android.support.v7.graphics.Palette宽度和高度必须为>;0,android,android-support-library,android-palette,Android,Android Support Library,Android Palette,我有一些代码使用了新的调色板类,我在Crashlytics上得到了这些崩溃报告,说宽度和高度必须大于0。奇怪的是,我这样称呼调色板代码: if( bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0){ //do something }else{ Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener() { ...

我有一些代码使用了新的
调色板
类,我在Crashlytics上得到了这些崩溃报告,说
宽度和高度必须大于0
。奇怪的是,我这样称呼调色板代码:

if( bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0){
   //do something
}else{
   Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener() {
.....
}
我正在使用来自
com.android的Palette类。支持:Palette-v7:23+


有什么想法可能是错误的吗

您可能试图在UI元素实际添加到布局之前访问其宽度和高度

这就是为什么宽度和高度都等于0,因为元素实际上并不存在

使用
ViewTreeObserver


其中
myView
将是您的位图

我认为您的代码没有任何问题。我在看你贴的StackTrace

at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:601)
at android.support.v7.graphics.Palette.scaleBitmapDown(Palette.java:282)
如果查看的源代码,您将发现在方法
scalebitmadown(位图)
中编写的缩放逻辑。如果“位图”小于100px,则不进行缩放。但是,如果“位图”大于100px,则调用
bitmap.createScaledBitmap()
。现在,如果宽度或高度<0,此方法将抛出
IllegalArgumentException


因此,您正在传递的位图没有零宽度,因为如果是这种情况,您将永远不会到达
bitmap.createScaledBitmap()
方法。尽管如此,我不确定真正的原因可能是什么。尝试浏览您正在使用的
调色板.java
的源代码。

问题与并发问题有关:因为您在调用

Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener()
位图是有效的,但当
调色板
在其自身的异步逻辑中使用位图时,位图可能为空或不再有效(由于并发操作)

此问题有一个简单的解决方案:由于提取关键颜色不需要高分辨率图像,只需提供从原始图像创建的低分辨率位图即可:

if( bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0){
   //do something
}else{
   //This resized bitmap is just an example: you should keep your bitmap
   //aspect ratio, and keep width and height < 100
   Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, 100, 100, false); 
   Palette.Builder(resizedBitmap).generate(new Palette.PaletteAsyncListener() {
.....
}

if(bitmap==null | | bitmap.getHeight()你真的确定位图有什么东西或甚至正在显示吗?调色板必须分析图像,几毫秒后,你就会得到颜色。我只是通过Crashlytics得到错误,从来没有发生在我身上。但我在调用调色板代码之前检查空值和大小。应用程序从未崩溃?你可以重新创建问题?如果没有…可能是有些用户使用低端智能手机,任务耗时太长,调色板查找空值(在调色板上崩溃,而不是在位图上崩溃)我的应用程序从来没有因为这个问题崩溃过。我不知道为什么在调色板运行时位图会变为空,调色板会不会引用它?也许位图正在被回收,但是错误会是关于它被回收的吗?我猜错误是由侦听器中的代码引起的。你能提供m吗ore代码(示例中的点)?我没有试图访问它,
调色板
类是。在调用
调色板
类之前,我正在检查宽度、高度和空值。我无法更改
调色板
代码,因此如何确保不会发生这种情况?在TreeObserver中调用调色板类。这样,位图在调色板之前定义te类尝试访问它。在调用调色板代码之前,我实际上没有这些位图加载到的视图。我在知道调色板颜色后将它们加载到视图中。这对我的大多数用户来说都很好,每天20k个用户中只有4到5个崩溃。有趣的想法,我会尝试。谢谢。@mntgoat不要忘记保留aspect比率在调整大小的位图中,或者您可能会得到错误的键颜色(示例中我强制使用100x100px)是的。我看到的Palette类的代码最小使用192。@mntgoat您应该在宽度和高度上使用小于100px的大小,以避免Palette创建额外的缩放/位图。我将在赏金到期之前奖励您,但我还不知道这是否是正确的答案。我将向我的beta用户发布它,如果我n过几天,我不会再遇到任何崩溃,然后我会将其标记为正确答案。Android Studio在我单击粘贴的stacktrace时给我的调色板代码有点不同,但它确实具有与您看到的相同的检查。我想如果检查和缩放之间的位图发生了什么情况,将是唯一的可能性。我的guess也是。崩溃是发生在某个特定的设备上,在某个特定的版本上吗?如果是这样的话,那么可能是操作系统版本的代码有错误。但无论如何,我认为你不会对此采取任何措施。
Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener()
if( bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0){
   //do something
}else{
   //This resized bitmap is just an example: you should keep your bitmap
   //aspect ratio, and keep width and height < 100
   Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, 100, 100, false); 
   Palette.Builder(resizedBitmap).generate(new Palette.PaletteAsyncListener() {
.....
}