Domanda

Ho cercato di ottimizzare il mio singola applicazione thread che carica un gruppo di piastrelle che il trucco di una bitmap di grandi dimensioni. L'applicazione stava diventando molto lento quando sarebbe caricare le nuove tessere nella memoria di sistema. Im ora alla ricerca cercando di utilizzare le attività asincrone per questo scopo. I rileva app che piastrella è in alto a sinistra in un metodo chiamato da OnDraw, crea una stringa che contiene il percorso della bitmap nella cartella Assets, e poi controlla se la bitmap è nullo prima di disegnare. Se è nullo, caricherà in memoria. La mia idea era quella di elaborare il bitmap in DoBackground, e in postExecute innescare un'invalidate vista per visualizzare l'asincrona caricata bitmap. Alcune domande:

1.) Posso eseguire il mio compito asincrona per ogni bitmap? . (Questa dichiarazione: nuovo myAsyncTaskManager execute () (bitmapPath), in caso contrario, qual è il modo migliore per andare su di esso in quanto l'unica cosa asincrona farà è solo bitmap caricare in memoria

2.) E 'possibile impostare l'AsyncTask priorità se le bitmap caricano troppo lento?

3.) C'è un modo migliore per andare su questo? im certo è il carico bitmap, e non l'area di disegno che rallenta l'applicazione.

Il mio codice asincrona temporanea:

private class myAsyncTaskManager extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... bitmapPath) {
      Log.e("sys","i ran using aTask");
        try {

            bitmapArray[rectBeingDrawn] = BitmapFactory.decodeStream(assetManager.open(imagePathToLoad));


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       return null;
}


@Override
protected void onPostExecute(String result) {
    // execution of result of Long time consuming operation
    mCampusMap.invalidate();
}
}
È stato utile?

Soluzione

L'aggiunta di una nuova risposta alla tua completamente nuova domanda:)

  1. Dipende dalla quantità di bitmap. Quanti ne hai? Non si vuole creare decine di discussioni. Dopo tutto, si dispone di un solo core sul vostro hardware, in modo da avere più thread non si compra nulla - il cambio di contesto sarebbe solo attutire i. Se si dispone di tonnellate di bitmap, si consiglia di avere una coda di bitmap e di lavoro attraverso di essa. Per questo, un filo e Handler sarebbe in realtà essere migliore.

  2. E '. In generale, ho thread di livello impostato una priorità inferiore rispetto al filo principale.

Altri suggerimenti

Aspetta, si sta chiamando bitmapLoaderThread.run ()? È un po 'difficile capire cosa sta succedendo, perché questi sono frammenti di codice con nessun contesto (quello filo è qualcosa in esecuzione su Quale funzione??), Ma non si chiama run () - che è compito del sistema operativo! Per iniziare un nuovo thread, chiamare start () - questo creerà il nuovo thread e chiamare la sua funzione run (). Se si chiama esegue direttamente, si sta ancora chiamando nel vostro proprio thread!

Oltre a questo - come si fa a fare la stretta di mano tra i due fili? In che modo il thread di lavoro dire al thread principale che il bitmap viene caricato? È possibile utilizzare un gestore per questo, o è possibile utilizzare un AsyncTask al posto del filo del tutto.

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