Domanda

Sto cercando di caricare le immagini nella mia lista di listview da un adattatore personalizzato ma le bitmaps non visualizzano le immagini finché non scorrerò verso il basso e quindi scorrere indietro e non so perché!All'inizio Quando avevo caricato le immagini, l'applicazione si è schiantata perché non stavo caricando le immagini in modo efficiente.

(Sto memorizzando immagini in un DB di codificato a base64. So che non è una grande cosa da fare, ma ho bisogno di ottenere solo le cose il più rapido possibile).

domanda bonus Qual è il modo migliore per attivare un evento dopo che due chiamate DB asincrono sono complete?

Il mio codice per caricare bitmap:

public Bitmap decodeBitmap(String image, int reqWidth, int reqHeight)
    {
        byte[] decodedByte = Base64.decode(image, 0);
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length, options);

        options.inSampleSize = calculateSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        Bitmap bmp = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length, options);
        return bmp;
    }

    public int calculateSize(BitmapFactory.Options options, int reqWidth, int reqHeight)
    {

        final int height = options.outHeight;
        final int width = options.outWidth;
        int size = 1;

        if (height > reqHeight || width > reqWidth)
        {
            if (width > height)
            {
                size = Math.round((float) height / (float) reqHeight);
            }
            else
            {
                size = Math.round((float) width / (float) reqWidth);
            }
        }
        return size;
    }
.

Listview

È stato utile?

Soluzione

Il modo migliore e più semplice per caricare le immagini in imageviews è di utilizzare un processo di sfondo per eseguire l'attività, poiché il blocco dell'interfaccia sarà una cattiva esperienza utente. Sono un sacco di campioni di codice online, ad esempio è possibile utilizzare la classe ImageLoader da questo tutorial. Basta aggiungerlo al tuo progetto e usarlo come:

ImageLoader loader = new ImageLoader(context);
loader.DisplayImage(url, imagview);
.

Modifica: Quando lo prendi dal web, probabilmente stai ottenendo l'immagine come un flusso. Potresti farlo, ma il modo più efficiente e popolare per affrontare le immagini nei database, è quello di non memorizzare i dati effettivi dell'immagine nel database, poiché l'operazione di lettura / scrittura non è efficiente.

Invece ciò che puoi fare è, per memorizzare il flusso che ottieni dal web a un file in qualche cartella, e una volta che lo memorizzi, memorizza il percorso che punta nel database in cui si trova l'immagine. In questo modo il tuo database è molto più leggero e apri l'immagine solo quando ne hai bisogno. In realtà questo è il modo corretto di gestire le immagini perché una volta che la dimensione dell'immagine aumenta, leggendo da esso non sarà possibile, poiché Android limita la dimensione della finestra del cursore a 1 MB.

Quindi ti consiglio di modificare il tuo codice come spiegato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top