2010-10-12 6 views
1

Mon problème est que j'avais un programme qui fonctionnait avant, sans thread, et il a fallu beaucoup de temps pour traiter les informations (16 secondes pour obtenir des données XML et les afficher). Maintenant, j'ai tout le threading et async down, mais pour une raison quelconque, il rend mon programme SLOWER (dans l'émulateur, le périphérique n'est pas disponible pour le moment), y at-il quelque chose que j'ai fait qui aurait pu causer cela, le Le thread d'interface utilisateur est correct, mais mon thread asynchrone prend une minute et demie à exécuter. (Quand je l'avais dans le thread d'interface utilisé pour prendre seulement 16 secondes, mais a gelé le thread d'interface utilisateur)Asynctask prenant une quantité de temps ridicule

Voici le code pour mon fils, il se trouve à l'intérieur de la classe principale:

private class TeamSearchTask extends AsyncTask<String,Void,String> { 

    CharSequence nfo; 
    String [] matches; 
    String [] data; 
    String teamNum; 
    ProgressDialog loading; 

    protected void onPreExecute() 
    { 
     //Show the 'loading' dialog 
     loading = new ProgressDialog(SapphireAlliance.this); 
     loading.setMessage("Loading, please wait..."); 
     loading.show(); 
    } 

    protected String doInBackground(String... teamNumber) 
    { 
     try 
     { 
      //Team information ------------------------------------------------------------------------------------ 
      teamNum = teamNumber[0];   
      //Array of team data 
      data = APIconnection.getTeams(teamNum, ""); 

      //Display basic team info 
      nfo = ("\nFormal Team Name:\n" + data[1] + 
        "\n\nLocation:\n" + data [3] + ", " + data[4] + ", " + data[5] + 
        "\n\nRookie Year:\n" + data[6] + 
        "\n\nRobot Name:\n" + data[7] + 
        "\n\nWebsite:\n" + data[8] + "\n\n\n\n\n\n\n\n\n"); 

      //Make match archive -------------------------------------------------------------------------------------- 

      String [] events = APIconnection.getEventIdsByYear(year1); 
      ArrayList<String> matches = new ArrayList<String>(); 
      for (int i = 0; i<events.length; i++) 
      { 
       String [] add = APIconnection.getMatches2(teamNum, events[i] ,"",""); 
       for(int j = 0; j<add.length; j++) 
        matches.add(add[j]);    
      } 
      String [] out = new String [matches.size()]; 
      matches.toArray(out); 
      return ""; 
     } 
     catch(Exception e) 
     { 
      return e.toString(); 
     } 
    } 

    protected void onPostExecute(String result) { 
     if(result.equals("")) 
     { 
      info.setText(nfo); 
      matchArchive(matches); 

      //title 
      CharSequence ttl = "Team " + teamNum; 
      titlets.setText(ttl.toString()); 
      loading.dismiss(); 
     } 
     else 
     { 
      alert.setMessage(result); 
      alert.show(); 
     } 
    } 
} 

Tout là-dedans qui pourrait causer cela? : |

Répondre

0

Il est possible que votre priorité de thread ne soit pas trop élevée. Je me souviens que la valeur par défaut est plutôt faible. Cependant, pour ce que vous faites, cela ne devrait pas prendre plus de quelques secondes. Je pense que le vrai problème réside dans la connexion API sur le réseau et de faire quelque chose qui prend beaucoup de temps. En particulier, cette boucle for qui récupère l'événement ferait beaucoup de travail si chaque appel ouvre un nouveau socket, en supposant que ce soit pour les premières correspondances. : P

+1

Oui! C'est pour les premiers matchs! <3 xD Existe-t-il un moyen d'augmenter la priorité? Mon programme s'exécute extrêmement bien et rapidement d'autres fois et a couru en réalité plus rapidement quand il était sur le fil de l'interface utilisateur! – Nick

+0

Hm. Je pensais qu'il y avait un moyen de le faire pour AsyncTask, mais je suppose que non. Je pense que votre véritable problème est de savoir comment vous vous connectez à la source de données ou comment vous analysez le XML. 16 secondes sur un fil d'interface utilisateur principal semble un peu lent pour ce genre d'opération. –

+0

Est-ce peut-être parce que j'utilise: javax.xml.parsers.DocumentBuilderFactory; javax.xml.parsers.DocumentBuilder; org.xml.sax.SAXException; org.xml.sax.SAXParseException; ceux au lieu de android.sax? – Nick

0

J'ai le même problème, ne faisant rien de plus qu'une copie de fichier avec un simple décryptage DES ... tout s'est déroulé en quelques secondes sur le thread UI, mais lorsqu'il est déplacé dans un ASYNCTASK il prend maintenant MINUTES à accomplir. Incroyable.