Question

J'ai essayé d'optimiser mon application unique de fil qui charge un tas de tuiles que le maquillage d'un grand bitmap. L'application devenait très lent quand il chargeait les nouvelles tuiles dans la mémoire du système. Im voyez maintenant essayer d'utiliser les tâches Async à cet effet. L'application détecte que la tuile est en haut à gauche dans une méthode appelée par onDraw, crée une chaîne qui contient le chemin de l'image bitmap dans le dossier actif, puis vérifie si la bitmap est nulle avant de tirer. Si elle est nulle, il se charge en mémoire. Mon idée était de traiter le bitmap dans DoBackground, et postExecute déclencher une invalidate de vue pour afficher le bitmap chargé async. Peu de questions:

1.) Puis-je exécuter ma tâche de Async pour chaque bitmap? (Cette déclaration:.? Nouveau myAsyncTaskManager () execute (bitmapPath), sinon, quelle est la meilleure façon d'aller à ce sujet puisque la seule chose Async va faire est de charger juste bitmaps en mémoire

2.) Est-il possible de définir la priorité AsyncTask si les bitmaps chargent trop lent?

3.) Y at-il une meilleure façon d'aller à ce sujet? im certain qu'il est le chargement bitmap, et non le dessin de la toile qui ralentit l'application.

Mon code temporaire Async:

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();
}
}
Était-ce utile?

La solution

Ajout d'une nouvelle réponse à votre question tout à fait nouvelle:)

  1. Cela dépend de la quantité de bitmaps. Combien en avez-vous? Vous ne voulez pas créer des dizaines de fils. Après tout, vous avez seulement un noyau sur votre matériel, afin d'avoir plusieurs threads ne vous acheter quelque chose - juste le changement de contexte serait le noyer. Si vous avez des tonnes de bitmaps, vous pouvez avoir une file d'attente de bitmaps et de travailler à travers elle. Pour cela, un fil et gestionnaire serait en fait mieux.

  2. Il est. En général, je mets un travailleur visse niveau de priorité inférieur au thread principal.

Autres conseils

Attendez, vous appelez bitmapLoaderThread.run ()? (? quel fil est quelque chose en cours d'exécution sur Quelle fonction), il est un peu difficile de comprendre ce qui se passe parce que ce sont des extraits de code sans contexte, mais vous ne l'appelez pas run () - qui est le travail du système d'exploitation! Pour démarrer un nouveau thread, vous appelez start () - cela va créer le nouveau thread et appeler sa fonction run (). Si vous appelez directement l'exécution, vous appelez toujours dans votre fil!

Autre que cela - comment faites-vous la poignée de main entre les deux fils? Comment le thread de travail dit le thread principal que le bitmap est chargé? Vous pouvez utiliser un gestionnaire pour cela, ou vous pouvez utiliser un AsyncTask au lieu du fil tout à fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top