2015-09-28 74 views
6

我有一些代碼使用新的Palette類,我得到Crashlytics這些崩潰報告說,width and height must be > 0。奇怪的是,這是我如何調用調色板代碼:android.support.v7.graphics.Palette寬度和高度必須> 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) 

com.android.support:palette-v7:23+

什麼可能是錯的任何想法,我現在用的調色板類?

+0

你真的確定位圖有什麼或甚至顯示?調色板必須分析圖像,幾毫秒後,你會看到顏色。 –

+0

嗯,我只能通過Crashlytics得到錯誤,從來沒有發生過我。但是在調用調色板代碼之前我正在檢查null和size。 – casolorz

+0

該應用永不崩潰?你可以重新創建這個問題?如果沒有...也許一些用戶有一個低端的智能手機和任務花了太多時間和調色板找到空值(碰撞調色板,而不是在位圖) –

回答

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將位圖

+0

我沒有試圖訪問它,'Palette'類是。我在調用'Palette'類之前檢查寬度和高度,並檢查null。我無法更改'Palette'代碼,所以我如何確保這不會發生? – casolorz

+0

調用TreeObserver中的Palette類。這樣,在調色板類嘗試訪問它之前定義了位圖。 –

+0

我實際上並沒有意識到這些位圖在調用調色板代碼之前已加載。我知道調色板顏色後,將它們加載到視圖中。這對我的大多數用戶來說都很好,每天只有20k的用戶每天只有4次或5次的崩潰。 – casolorz

0

我不認爲你的代碼有任何問題。我在看你發佈的StackTrace。

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

如果你看看Palette.java的源代碼,你會發現寫在方法scaleBitmapDown(Bitmap bitmap)比例縮放邏輯。如果你的'位圖'小於100px,那麼不會進行縮放。但是,如果你的「位」比100像素更大,那麼Bitmap.createScaledBitmap()被調用。現在,這個方法拋出IllegalArgumentException如果任一寬度或高度< 0;

所以你逝去的不具有零寬度,因爲如果是這樣的話,你可能就不位圖都達到了Bitmap.createScaledBitmap()方法。話雖如此,我不確定真正的原因可能是什麼。試圖通過精確的Palette.java的源代碼,您正在使用下去。

+0

當我點擊粘貼堆棧跟蹤時,Android Studio爲我提供的Palette代碼有點不同,但它的確有與您所看到的相同的檢查。我猜如果檢查和縮放之間的位圖發生了什麼事是唯一的可能性。 – casolorz

+0

我的猜測也是。在特定版本的某個特定設備上是否發生崩潰?如果是這樣的話,那麼操作系統版本代碼可能有bug。但無論如何,我不認爲你會對此做任何事情。 – Henry

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() { 
..... 
} 
+0

有趣的想法,我會嘗試。謝謝。 – casolorz

+0

@mntgoat不要忘記在你調整大小的位圖中保留寬高比,否則你可能會得到錯誤的鍵盤顏色(在這個例子中我強制顯示100x100px) – bonnyz

+0

是的,我是。我實際看到的Palette類的代碼最少使用192。 – casolorz

相關問題