6

我有一些使用新Palette类的代码,我在 Crashlytics 上收到这些崩溃报告,说width and height must be > 0. 奇怪的是,这就是我调用调色板代码的方式:

if( bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0){
   //do something
}else{
   Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener() {
.....
}

所以我只是不确定位图怎么可能突然没有正确的高度或宽度。我不知道异常来自我的哪一段代码,因为报告只包含调色板类中的内容。

这是一个例外:

java.lang.RuntimeException: An error occured while executing doInBackground()
       at android.os.AsyncTask$3.done(AsyncTask.java:300)
       at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
       at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
       at java.util.concurrent.FutureTask.run(FutureTask.java:242)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalArgumentException: width and height must be > 0
       at android.graphics.Bitmap.createBitmap(Bitmap.java:815)
       at android.graphics.Bitmap.createBitmap(Bitmap.java:794)
       at android.graphics.Bitmap.createBitmap(Bitmap.java:725)
       at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:601)
       at android.support.v7.graphics.Palette.scaleBitmapDown(Palette.java:282)
       at android.support.v7.graphics.Palette.access$100(Palette.java:67)
       at android.support.v7.graphics.Palette$Builder.generate(Palette.java:557)
       at android.support.v7.graphics.Palette$Builder$1.doInBackground(Palette.java:623)
       at android.support.v7.graphics.Palette$Builder$1.doInBackground(Palette.java:620)
       at android.os.AsyncTask$2.call(AsyncTask.java:288)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at java.lang.Thread.run(Thread.java:818)

我正在使用 Palette 类com.android.support:palette-v7:23+

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

4

3 回答 3

0

该问题与并发问题有关:由于您Palette以“异步”方式使用,当您调用

Palette.Builder(bitmap).generate(new Palette.PaletteAsyncListener()

您的位图是有效的,但是当Palette在其自己的异步逻辑中使用该位图时,该位图可能为空或不再有效(由于并发操作)。

这个问题有一个简单的解决方法:因为您不需要高分辨率图像来提取关键颜色,只需提供从原始图像创建的低分辨率位图:

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() {
.....
}
于 2015-10-13T08:23:24.760 回答
0

您可能正在尝试在 UI 元素实际添加到布局之前访问它的宽度和高度。

这就是为什么你一直得到宽度和高度等于 0,因为元素实际上并不存在。

使用ViewTreeObserver http://developer.android.com/reference/android/view/ViewTreeObserver.html

    myView.getViewTreeObserver().addOnPreDrawListener(
            new ViewTreeObserver.OnPreDrawListener() {
                public boolean onPreDraw() {

                        int finalHeight = myView.getMeasuredHeight();
                        int finalWidth = myView.getMeasuredWidth();
                        // Do your work here


                    return true;
                }
            });

myView你的位图在哪里

于 2015-09-28T18:39:47.610 回答
0

我认为您的代码没有任何问题。我正在查看您发布的 StackTrace。

at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:601)
at android.support.v7.graphics.Palette.scaleBitmapDown(Palette.java:282)

如果你查看Palette.java的源代码,你会发现缩放逻辑写在method 中scaleBitmapDown(Bitmap bitmap)。如果您的“位图”小于 100 像素,则不进行缩放。但是,如果您的“位图”大于 100 像素,则会Bitmap.createScaledBitmap()调用。现在这个方法抛出IllegalArgumentException如果宽度或高度 < 0;

因此,您传递的位图宽度不为零,因为如果是这种情况,您根本就不会到达该Bitmap.createScaledBitmap()方法。话虽如此,我不确定真正的原因可能是什么。Palette.java尝试浏览您正在使用的确切源代码。

于 2015-10-13T04:51:40.283 回答