2010-11-10 15 views
0

J'ai une application qui lit les fichiers de la carte SD et effectue un traitement intense.Création d'un thread dans l'objet Application

Pour accélérer l'expérience utilisateur

J'ai créé une sous-classe d'objet Application. Avec dans ce que j'ai créé un fil où, j'ai effectivement eu une référence aux fichiers sur Sdcard et a fait les activités de démarrage de sorte qu'une fois l'activité est affichée il n'y a pas de retard à l'utilisateur.

public class GAppClass extends Application { 

    class setMapDirThread extends Thread { 

     public void run() { 
    setMapDir(); 
     } 
    } 


    public void onCreate() { 

       setMapDirThread objThread = new setMapDirThread(); 
     objThread.start(); 

     } 

private void setMapDir() { 

    Log.d(TAG, "Inside initMapComponent"); 
    String extDirName = Environment.getExternalStorageDirectory() 
    .getAbsolutePath(); 
         /* 
         some processing related to opening and reading files from Sdcard and 
         allocating cache 
         */ 

     } 
} 

L'approche mentionnée ci-dessus est-elle sûre à utiliser? En d'autres termes, créer un thread dans la classe d'application pour effectuer un traitement en arrière-plan est une bonne approche ou une mauvaise solution? Ralentit-il le démarrage de l'application? Est-il prudent de créer un fil comme celui-ci pour lire le contenu de Sdcard et allouer de la mémoire pour la mise en cache interne?

Répondre

0

Cela dépend de ce que fait votre application. Si cela ne concerne que des activités, alors ça devrait aller, mais ce n'est pas recommandé (malgré ce que vous avez pu lire). Si votre application a des récepteurs de services ou de diffusion, votre application sera créée selon vos besoins et lancera le thread de mise en cache, etc. Envisagez de créer une classe singleton dans votre application, dans laquelle il y a des initialiseurs statiques qui peuvent faire ce que vous voulez. Commencez. Cela maintient la classe Application propre. Vous pouvez également envisager d'utiliser un appel de méthode à votre classe singleton pour initialiser le cache, et l'appeler au tout début de onCreate() des activités qui en ont besoin. Je parie que votre cache serait configuré assez rapidement.

+0

J'ai un service qui, est créé immédiatement après que BootComplete Intent est reçu. Donc l'objet d'application serait créé au moment du démarrage. Et le service est destiné à rester longtemps jusqu'à ce que l'appareil est éteint. –

+0

En fait, la création du cache et la lecture des fichiers à partir de Sdcard se font par un appel à une tierce partie api et ça prend énormément de temps en environ 3 secondes (je pense qu'il fait aussi une autre initialisation). Ce temps n'est pas durable pendant l'activité startUp. –

+0

ce que j'ai l'intention est d'accélérer le processus d'initialisation sans retarder l'application ou le temps de démarrage de l'activité, donc des suggestions? –

1

Je ne vois aucun problème à lancer des threads pour effectuer des opérations de longue durée. La classe d'application est aussi bonne que n'importe où. Vous pouvez également utiliser la classe AsyncTask d'Android. Cela pourrait faciliter votre travail: http://developer.android.com/reference/android/os/AsyncTask.html

+0

Je ne pense pas que nous pouvons créer AsyncTask dans l'objet Application, car il donnerait une exception disant "Cant create Handler qui, n'a pas appelé Looper.prepare". –