2013-02-09 5 views

risposta

105

Usa nuova SparseArray<String>(...) invece per migliorare le prestazioni

Hai trovato questo avviso a causa del motivo descritto here.

SparseArray esegue l'integrazione degli oggetti negli oggetti. A differenza di un normale array di oggetti , è possibile che vi siano degli spazi negli indici. È inteso essere più efficiente rispetto all'utilizzo di una HashMap per mappare i numeri interi agli oggetti.

Ora

come uso SparseArray?

Puoi farlo da modi di seguito:

  1. HashMap modo:

    Map<Integer, Bitmap> _bitmapCache = new HashMap<Integer, Bitmap>(); 
    private void fillBitmapCache() { 
        _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt)); 
        _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper)); 
        _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
    } 
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon); 
    
  2. SparseArray modo:

    SparseArray<Bitmap> _bitmapCache = new SparseArray<Bitmap>(); 
    private void fillBitmapCache() { 
        _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt)); 
        _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper)); 
        _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
    } 
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon); 
    

Spero che possa essere d'aiuto.

+0

Assicurarsi di vedere la documentazione collegata che spiega dettagliatamente che "l'implementazione non è destinata a essere appropriata per strutture di dati che possono contenere un numero elevato di elementi". Un SparseArray è generalmente più lento di una HashMap comparabile. –

39

SparseArray viene utilizzato quando si utilizza uno Integer come chiave.

Quando si utilizza il SparseArray, il chiave rimarrà come primitivo variabile in ogni momento a differenza di quando si utilizza il HashMap in cui è richiesto di avere un Object come chiave che farà sì che il int per diventare un oggetto solo per un breve periodo durante il recupero dell'oggetto nella mappa.

Usando il SparseArray vi farà risparmiare la Collector Garbage po 'di lavoro.

Quindi utilizzare proprio come un Map<Integer,String>.

+4

+1, evita l'autoboxing (e gli oggetti associati + GC) che si verificano con HashMap. @ cyril-mottier ha scritto a questo proposito qui: https://speakerdeck.com/cyrilmottier/optimizing-android-ui-pro-tips-for-creating-smooth-and-responsive-apps – orip

+0

Tecnicamente sei ** non ** " usando un 'Intero' come chiave". Stai usando un 'int'. –

5

È un suggerimento che esiste una struttura dati migliore per il codice.

Quel suggerimento è da Lint. Di solito lo ottieni quando hai un HashMap di numeri interi in qualcos'altro.

Il suo più grande vantaggio è trattare la chiave intera come una primitiva. In altre parole, non sarà nascosto a un Integer (l'oggetto Java) per utilizzarlo come chiave.

Questo è un grosso problema quando si utilizzano mappe di grandi dimensioni. HashMap comporterà la creazione di molti, molti oggetti Integer in quel caso.

Vedere alcuni altri pezzi di informazioni here.

+0

https://developer.android.com/reference/android/util/SparseArray.html afferma: "L'implementazione non è pensata per le strutture dati che possono contenere un numero elevato di elementi. È generalmente più lenta di una HashMap tradizionale , ... "- questo significa che se sei interessato alla velocità e vuoi memorizzare molti valori devi usare HashMap. –

Problemi correlati