2013-08-09 4 views
0

J'essaie d'obtenir des données json à partir de dump (qui est une carte). Donc Idée est quand une activité est lancée thread de fond lire les données JSON et dump. Le thread de l'interface utilisateur s'exécute et ArrayList doit être mis à jour à partir des données de vidage.Exécution d'un thread de gestionnaire avant le thread d'interface utilisateur

Mon code est

Public class myclass extends ListActivity{ 

protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

    MyHandlerMethod(); 
ArrayList deals = new ArrayList(SessionStore.getFromDump("someData")); 
} 

MyHandlerMethod(){ 

//A handler thread 
//Json parsing and adding data to dump runs here 
} 

} 

// classe Sessionstore méthode ont getFromDump() qui ont la carte à l'intérieur pour stocker des données.

// Lorsque MyHandlerMethod est exécuté, cette carte doit être mise à jour.

Mais je chaque thread thread UI est en cours d'exécution avant MyHandlerMethod() pour que SessionStore.getFromDump ("someData") reste null.

Comment puis-je m'assurer de faire tourner le fil du manipulateur avant le filetage de l'interface utilisateur.

C'est une activité de liste. Qu'est-ce que je veux est arraylist devrait être mis à jour à partir de vidage et j'utiliser cette liste de tableau pour l'activité de la liste.

+0

Bien que le thread soit appelé depuis le thread principal (interface utilisateur principale), vous ne pouvez donc pas l'exécuter avant cela, vous pouvez cependant attendre que le thread d'arrière-plan se termine, puis afficher, 'SessionStore.getFromDump (" someData ")'. – g00dy

Répondre

3

Pour cela, vous devez utiliser un AsyncTask et mettre à jour votre interface utilisateur avec les méthodes onProgressUpdate/publishProgress et onPostExecute.

http://developer.android.com/reference/android/os/AsyncTask.html

Voici un exemple de la façon dont cela pourrait fonctionner:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 

    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); // here you can for example update your progress bar, your textviews, whatever UI... 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
+0

J'espère que cette réponse est assez claire pour vous. Sinon, n'hésitez pas à demander des informations détaillées. –

+0

Comment asyncTask mettra à jour les données de vidage avant l'exécution de ArrayList dans le thread UI. C'est la même chose que le gestionnaire. –

+0

Initialisez simplement votre ArrayList lorsque l'activité est créée, puis ajoutez les éléments à ArrayList dans la méthode onProgressUpdate ou onPostExecute. –

1

Vous devez utiliser AsyncTask pour obtenir des données de données et mettre à jour le thread d'interface utilisateur. Here the reference.

1

Vous ne pouvez pas exécuter un HandlerThread avant le thread d'interface utilisateur. Mais vous pouvez attendre que la tâche d'arrière-plan charge les images tout en affichant un ProgressDialog, par exemple. Je vous recommande d'utiliser une asyncTask.

Ceci est un bon tutoriel sur les processus d'arrière-plan, y compris AsyncTask.

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

0

Si vous ne voulez pas ou ne pouvez pas utiliser un AsyncTask, peut-être que vous voulez spécifier Thread priorité ou autre.

Vous pouvez commencer une HandlerThread puis appelez getLooper() pour obtenir le son Looper que vous pouvez ensuite passer à un Handler afin qu'il puisse recevoir et traiter des messages sur ce fil.

Mais l'utilisation d'un AsyncTask est la solution simple.

Questions connexes