2011-04-11 3 views
1

J'ai une application qui obtient les données pour un jour donné en réponse d'un serveur web et qui trace le graphique o/p en fonction des données (nombre/heure) qui sont arrivées.android async tasks

Maintenant, j'appelle le serveur web comme une tâche asynchrone.

Je peux également passer sur plusieurs écrans (jour précédent/jour suivant) pour appeler plusieurs fois le serveur Web (plusieurs tâches asynchrones) afin d'obtenir les données du serveur.

Le problème est lorsque le nombre de lancements (tâches asynchrones) augmente, l'application affiche ANR.

Existe-t-il une meilleure façon de gérer ce type de scénarios plutôt que de créer une tâche asynchrone pour chaque appel de serveur Web (fling).

Ajout partie du code:

if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
      && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
     valuesDayWithTime=onStart(datePrevious); 
} 



public GraphView onStart(String date){ 
    urlFinal=createUrl(); 
    new DownloadDataTask(this).execute(urlFinal); 
} 

private class DownloadDataTask extends AsyncTask<String, Integer, Long> { 

    YieldActivity yActivity; 
    ProgressBar pBar ; 
    DownloadDataTask(YieldActivity act){ 
     yActivity=act; 
    } 

    protected void onPreExecute() { 
     relLay=(RelativeLayout) findViewById(R.id.graphView); 
     pBar 
     = new ProgressBar(yActivity); 
     LayoutParams lp =new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); 
     pBar.setLayoutParams(lp); 
     pBar.setMax(100); 
     relLay.removeAllViews(); 
     relLay.addView(pBar); 
    } 

    protected Long doInBackground(String... urls) { 
     int totalCount = urls.length; 
     for (int i = 0; i < totalCount; i++) { 
      publishProgress((int) ((i/(float) totalCount) * 100)); 
      downloadFromUrl(urls[i]); 
     } 
     return (long) totalCount; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     Log.i(progress[0] +"%"); 
    } 

    protected void onPostExecute(Long result) { 

     graphViewDay=calculate(dateNow,valuesDayWithTime); 
     relLay.removeView(pBar); 
     relLay.addView(graphViewDay); 


    } 
} 

public void downloadFromUrl(String fromURL) { 
    try { 
     getHttpResponse(fromURL.toString()); 

     parseResponse(); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Veuillez poster la solution qui a fonctionné pour vous afin que d'autres puissent s'y référer. –

Répondre

2

Tant que vous créez les objets AsyncTask sur le thread principal et appelant exécuter sur eux depuis le thread principal, il ne devrait pas y avoir de problème. Pouvez-vous poster du code pseudo pour votre AsyncTask? Vous pouvez trouver plus sur AsyncTask here.

+0

salut advantej, j'ai ajouté un peu d'extrait de code que je fais pour cela. – Deva

+0

Etes-vous sûr qu'aucune des méthodes de DownloadTask qui s'exécutent sur le thread principal (onPreExecute, onPostExecute et onProgressUpdate) n'est longue à exécuter? C'est la seule raison pour laquelle je pense qu'une ANR sera lancée. Toute tâche longue dans doInBackground est acceptable. – advantej