2013-01-04 26 views
7

Patrząc na kod źródłowy dla TypedArray (link), nie mogę zrozumieć, jaka jest różnica między tymi dwoma metodami. getInt() jest w zasadzie taki sam jak getInteger(), ale z małym dodatkiem na końcu, którego nie rozumiem. Czy ktoś może mi to wytłumaczyć?Jaka jest różnica między TypedArray.getInteger() i TypedArray.getInt()?

Powodem, dla którego muszę znać różnicę, jest implementacja niestandardowej podklasy Preference i uzyskanie wartości domyślnej potrzebuję przesłonić onGetDefaultValue(), która pobiera liczbę całkowitą z obiektu TypedArray. Przykład:

@Override 
protected Object onGetDefaultValue(TypedArray a, int index) 
{ 
    return a.getInteger(index, DEFAULT_VALUE); 
} 

Tutaj używam getInteger(), ale jeśli getInt() jest lepszy, wtedy użyję tego.

Odpowiedz

7

Po prostu mają różne przypadki "wszystko inne zawiedzie". Oba zwracają wartość int dla poprawnego int i defValue dla . Różnica polega na tym, jak radzą sobie z przypadkiem żadnego z nich.

Z link:

/* 
* Copyright (C) 2008 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

TypedValue v = mValue; 
if (getValueAt(index, v)) { 
    Log.w(Resources.TAG, "Converting to int: " + v); 
    return XmlUtils.convertValueToInt(
     v.coerceToString(), defValue); 
} 
Log.w(Resources.TAG, "getInt of bad type: 0x" 
     + Integer.toHexString(type)); 
return defValue; 

Jest to dodatkowy do którego się odnosimy. Wygląda na to, że konwertuje nieznaną wartość na ciąg, a następnie na liczbę całkowitą. Może to być przydatne, jeśli masz zapisaną "12" lub inną równorzędną wartość.

Dodatkowo getInteger zgłasza wyjątek, jeśli nie jest to null, a nie int. W przeciwieństwie do wszystkiego, jeśli wszystko inne zawiedzie, getInt zwraca wartość domyślną.

Należy również pamiętać, że zachowanie ich w tym przypadku jest na tyle różne, że w każdym przypadku wywołanie jednego z wyższych w drugim byłoby nieprawidłowe. Najlepszym rozwiązaniem jest to, które pasuje do oczekiwań na porażkę.

+0

Dzięki. Więc który z nich użyłbyś dla 'onGetDefaultValue()'? Myślę, że pójdę z 'getInt()', ponieważ "próbuje trochę trudniej" i przynajmniej zwróci coś. –

+1

Hmmm, właśnie przetestowałem oba z non-int non-null input (określam bełkotliwy ciąg dla atrybutu 'android: defaultValue' XML) i wygląda na to, że oba generują wyjątki, jeśli napotkano nieznaną wartość (' getInt() ' zgłasza wyjątek, jeśli linia XMLUtils nie powiedzie się). Więc nie sądzę, że to naprawdę ma znaczenie, które jest używane w 'onGetDefaultValue()' ... –