Android "Tentare di utilizzare bitmap riciclata"?

Sto eseguendo un problema con bitmap su un'applicazione Android che sto lavorando. Quello che si suppone è che l'applicazione scarica le immagini da un sito web, li salva sul dispositivo, li carica nella memory come bitmap in un arrayslist e li visualizza all'utente. Tutto ciò funziona bene quando l'applicazione viene prima avviata. Tuttavia, ho aggiunto un'opzione di aggiornamento per l'utente in cui le immagini vengono eliminate e il process descritto in precedenza inizia tutto.

Il mio problema: utilizzando l'opzione di aggiornamento le vecchie immagini erano ancora in memory e avrei rapidamente ottenuto OutOfMemoryErrors. Pertanto, se le immagini vengono aggiornate, l'ho eseguita attraverso l'architetto e riciclato le vecchie immagini. Tuttavia, quando l'applicazione viene caricata per caricare le nuove immagini nell'archivista, si blocca con un errore "Tentativo di utilizzare bitmap riciclato".

  • Il codice di attività principale viene eseguito, ma il risultato (animation) non viene mostrato
  • Android: come disegnare un bordo di un LinearLayout
  • come impostare il metodo onClick con linearLayout?
  • Come get Mappa su un'applicazione Android firmata?
  • come inserire la data type date (yyyy-MM-dd) nel database sqlite e trascrivere dati tra due date in android
  • Devi call Parse.initialize () prima di utilizzare la libreria di Parse su Android
  • Per quanto lo capisco, il riciclaggio di un bitmap distrugge la bitmap e libera la sua memory per altri oggetti. Se voglio utilizzare nuovamente il bitmap, è necessario reinizializzare. Credo che lo faccio quando i nuovi file vengono caricati nell'architetto, ma qualcosa è ancora sbagliato. Qualsiasi aiuto è molto apprezzato perché questo è molto frustrante. Il codice problema è sotto. Grazie!

    public void fillUI(final int refresh) { // Recycle the images to avoid memory leaks if(refresh==1) { for(int x=0; x<images.size(); x++) images.get(x).recycle(); images.clear(); selImage=-1; // Reset the selected image variable } final ProgressDialog progressDialog = ProgressDialog.show(this, null, this.getString(R.string.loadingImages)); // Create the arrays with the image bitmaps in it new Thread(new Runnable() { public void run() { Looper.prepare(); File[] fileList = new File("/data/data/[package name]/files/").listFiles(); if(fileList!=null) { for(int x=0; x<fileList.length; x++) { try { images.add(BitmapFactory.decodeFile("/data/data/[package name]/files/" + fileList[x].getName())); } catch (OutOfMemoryError ome) { Log.i(LOG_FILE, "out of memory again :("); } } Collections.reverse(images); } fillUiHandler.sendEmptyMessage(0); } }).start(); fillUiHandler = new Handler() { public void handleMessage(Message msg) { progressDialog.dismiss(); } }; 

    }

  • Accesso alla variabile dalla class interna senza renderla definitiva
  • Errore di generazione di unità Unity WIN32 Exception ZipAlign
  • Reloopssta con visualizzazioni dinamiche multiple che sono gonfiate all'interno della row
  • ActivityManager.getRunningTasks è obsoleto android
  • twitter4j nessuna sfida di authentication trovata
  • La differenza tra la lancia in esecuzione tramite il menu di Android Studio e la row di command gradlew
  • 2 Solutions collect form web for “Android "Tentare di utilizzare bitmap riciclata"?”

    In realtà non è necessario call qui il metodo di riciclo. Il button Aggiorna dovrebbe solo cancellare l'arrays, il collettore di rifiuti libererà la memory più tardi. Se ottieni OutOfMemory significa che altri oggetti sono ancora in riferimento alle tue vecchie immagini e Garbage Collector non può rimuoverli.

    Posso ritenere che alcuni ImageViews visualizzino le bitmap e mantengano riferimenti a quelle bitmap. Non è ansible rimuovere le bitmap vecchie mentre sono ancora visualizzate. Quindi una ansible soluzione è quella di eliminare ImageVIews. Dopo di che puoi cancellare l'arrays e riempirlo con nuove immagini.

    Il riciclaggio libera la memory, ma alcuni ImageView stanno ancora visualizzando la bitmap e non può farlo dopo il riciclaggio. Ecco perché si ottiene "Tentare di utilizzare bitmap riciclato".

    Questi sono solo ipotesi perché non riesco a vedere il tuo codice completo.

    Se la memory è molto grande, è meglio riciclare la bitmap. GC non può essere controllato.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.