2016-01-22 109 views
-1

我有這樣一個問題:這爲什麼有效? (sameAs的VS ==)

Why is this not working sometimes?

我比較的位圖和相應的執行代碼,但是代碼是不執行。我的問題收到了很多好的答案。其中一個有效的答案建議刪除==,並將其更改爲.sameAs(),以使我的應用可以在較新的手機上工作。

ClickGround = v.getBackground(); //Get the background of button clicked (ClickGround is a bitmap) 
     BitClick = ((BitmapDrawable) ClickGround).getBitmap(); //the bitmap background of the button clicked 

那麼,爲什麼更有效地使用sameAs()工作方法比使用==比較位圖?此外,爲什麼使用==工作在更低版本的android(kitkat)和sameAs更高版本?

感謝,

Ruchir

+0

如果你在鏈接問題中注意到,你會看到第一個答案陳述了一些關於「我比較不同的對象」的內容。爲什麼? –

回答

0

只是要清楚,sameAs()不工作「更有效地」,而是它是一個正常工作/可靠的只有一個。這是因爲==僅決定兩個對象是否相同 - 即指向同一個對象 - 但即使對於完全相同但恰巧不同的對象的位圖,也可能返回false。

您正在調用的方法可能會在某些設備上和API的合約中爲同一位圖返回不同的對象,因此==將返回false。如果該位是相同的(在所有的屬性,如相同)sameAs()將返回true:

Given another bitmap, return true if it has the same dimensions, config, 
and pixel data as this bitmap. If any of those differ, return false. If 
other is null, return false. 

它的背後同樣的想法:

void foo(Integer a, Integer b) { 
    if (a == b) { 
    ... 
    } 
} 

這幾乎肯定是錯的 - 通常要a.equals(b)或許Objects.equals(A,b)如果a可以爲空,否則即使調用,如:

foo(1234, 1234)

往往會失敗上面的比較。

+0

所以它只適用於對象是同一類的時候? –

+0

不是。也就是說,我不確定你的意思是「它的工作原理」,但它與課程沒有關係。一個好的經驗法則是,至少在你明白這一點之前,你應該永遠不要使用'=='來比較對象。您幾乎總是使用「equals」或其他可比較的方法來確定對象是否相同。在位圖的情況下,該方法是'sameAs()。 – BeeOnRope

+0

好的,讓我重述一下我的問題。你如何定義「兩個物體是相同的」? –

0

==是一個關係運算符,因此實際上只有對數字代表良好的價值觀

然而,sameAs的()是看所包含的數據,而不是整個文件,關於它的一切。

例如:

int a = 3; 
String b = "3"; 

我們知道,3是一個數值,「3」是代表一個數值的字符串。它們對於一個普通的人來說都是一樣的,只不過是一臺電腦。在這種情況下,如果你試圖比較

if (a==b){//something} 

我們知道,我們必須做一些翻譯,因爲這兩者是不一樣的計算機。

喜歡的東西

if (Integer.parseInt("b") == a){//do something} 

將需要甚至

if(Integer.toString(a).equals(b)){//do something) 

在圖像的情況下,兩個有着完全不同的位置和其他的參考,因此他們不可能是「對等」一個==類型比較。即使使用兩個字符串,它們在內存中擁有不同的位置,但不同的關聯值也是使用.equals()的原因。

在位圖的情況下,它們是一種抽象數據類型,所以即使equals()在這裏也不適用。因爲你需要比較包含的抽象數據sameAs()被使用。

+0

那我什麼時候應該用'equals()'over'sameAs()'? –

+0

這取決於有問題的班級。最好的做法是_value objects_重寫'equals'以允許更有意義的相等比較(否則它默認爲與我的答案中描述的'=='相同的標識)。無論出於何種原因,Android'Bitmap'類不會重寫'equals()',而是定義'sameAs()'具有基本相同的用途。我不知道爲什麼,但你總是可以爲此提出一個新問題。 – BeeOnRope

+0

請記住,Android有一些有關位圖的有趣事情,例如以MediaStore API爲例。在這種情況下,sameAs()不會是相同的返回「值」。它必須實際「查看」位圖並使用相同的比較,因爲它們是抽象數據類型,在這些情況下等於不適用。這個例子真的是以人性的方式來理解它。 – childofthehorn

0

那麼,爲什麼使用sameAs()方法比使用==來比較位圖更有效?

它不起作用更有效率。當==工作時,它比sameAs()更有效。

但是,sameAs()適用於==不起作用的情況。這就是您應該使用sameAs()而不是==來比較位圖的原因。

此外,爲什麼使用==工作在較低版本的android(kitkat)和sameAs在較高版本?

在較新的版本中,某些關於Bitmap對象被創建和共享(或不共享)的方式已更改。當您使用==進行測試時,您依賴的是未公開的實現特定行爲。這種行爲已經改變。

它爲什麼改變了?我的猜測是它是一個改變後臺位圖緩存機制的副作用。