2010-08-04 17 views
0

J'ai essayé d'optimiser mon application de thread unique qui charge un tas de tuiles qui composent un grand bitmap. L'application devenait très lente quand elle chargerait les nouvelles tuiles dans la mémoire du système. Im regardant maintenant en essayant d'utiliser des tâches asynchrones à cet effet. L'application détecte quelle mosaïque est en haut à gauche dans une méthode appelée par onDraw, crée une chaîne qui contient le chemin de l'image dans le dossier Assets, puis vérifie si l'image bitmap est nulle avant le dessin. S'il est nul, il le chargera en mémoire. Mon idée était de traiter le bitmap dans DoBackground, et dans postExecute de déclencher une vue invalidate pour afficher le bitmap chargé async. Quelques questions:Optimisation du chargement de bitmap à l'aide de aSyncTask

1.) puis-je exécuter ma tâche aSync pour chaque bitmap? (cette instruction: new myAsyncTaskManager() .execute (bitmapPath), sinon, quelle est la meilleure façon de procéder, puisque la seule chose que fait aSync est de charger des bitmaps dans la mémoire?

2.) Est-il possible? définir la priorité aSyncTask si les bitmaps se chargent trop lentement?

3.) Existe-t-il une meilleure façon de procéder? Je suis certain que c'est le chargement de bitmap, et non le dessin de 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(); 
} 
} 

Répondre

2

Ajout d'une nouvelle réponse à votre question complètement nouveau :)

  1. dépend de la quantité de bitmaps. Combien en avez-vous? Vous ne voulez pas créer des dizaines de threads. Après tout, vous n'avez qu'un seul noyau sur votre matériel, donc avoir plusieurs threads ne vous achètera rien - le changement de contexte ne ferait que l'étouffer. Si vous avez des tonnes de bitmaps, vous voudrez peut-être avoir une file d'images bitmap et travailler dessus. Pour cela, un Thread and Handler serait réellement meilleur.

  2. C'est. Généralement, je définis les threads de travail un niveau de priorité inférieur au thread principal.

+0

Il y a 416 tuiles. Il y a en moyenne 15 bitmaps dessinés pour une haute résolution. comme mon droide avec une résolution de 854 par 480, et il chargera généralement 5 bitmaps dans la mémoire pendant que vous faites défiler vers le bas. Donc, si je devais aller sur la route du fil, j'appellerais effectivement le fil pour charger le bitmap? Je ne pense pas que je doive retourner quoi que ce soit puisque le thread d'interface utilisateur dessine automatiquement les bitmaps une fois qu'il détecte qu'ils ne sont pas NULL. Je vois cela en exécutant myThread.run(); plus tôt ne travaillait pas aussi bien que j'espérais ha. – jfisk

+0

Je suis aussi confronté au même problème, une solution brillante pour cela? – zIronManBox

2

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

Autre que cela - comment faites-vous la poignée de main entre les deux threads? Comment le thread de travail indique-t-il le thread principal que le bitmap est chargé? Vous pouvez utiliser un Handler pour cela, ou vous pouvez utiliser une AsyncTask à la place du Thread.