2014-09-13 4 views
0

Je reçois les erreurs suivantes:

09-13 06:27:02.268: E/AndroidRuntime(476): at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1961) 
09-13 06:27:02.268: E/AndroidRuntime(476): at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794) 
09-13 06:27:02.268: E/AndroidRuntime(476): at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1315) 
09-13 06:27:02.268: E/AndroidRuntime(476): at android.os.AsyncTask.execute(AsyncTask.java:394) 

Et ci-dessous est mon code:

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

     @Override 
     protected String doInBackground(String... params) { 

      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
      String resultString = ""; 
      try { 
       boolean resultBoolean = Utils.downloadTurboVerseFile(params[0]); 

       if(resultBoolean){ 
        int progressPercentage = Integer.parseInt(params[2].substring(0,params[2].indexOf("."))); 
        resultString = "Downloading: "+params[1]; 

       } 
       else{ 

        resultString = "ERROR Downloading: "+params[1]; 
        this.doInBackground(params); 
       } 
      } catch (Exception e) { 
       Thread.interrupted(); 
       String exceptionString = e.toString(); 
      } 

      return resultString; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      if(result.contains("ERROR")){ 
       downloading.setTextColor(Color.parseColor("#f05036")); 

      } 
      else{ 
       downloading.setTextColor(Color.parseColor("#79a1ad")); 

      } 

      downloading.setText(result); 

      if(checkIfVersesDownloaded()){ 

       downloadProgressBar.setVisibility(View.INVISIBLE); 
       downloading.setText("Verses Have Been Downloaded."); 
       homeButton.setEnabled(true); 
       homeButton.setVisibility(View.VISIBLE); 

      } 



     } 

     @Override 
     protected void onPreExecute() {} 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 

J'exécute le code comme ceci:

while(i < verseTitles.size()){  
    new DownloadVerses().execute(verseMp3s.get(i), verseTitles.get(i),progressString); 
    i++;          
} 

Je pense qu'il y a probablement une solution simple qui consiste à ajouter du code à ma classe privée DownloadVerses?

+0

Quelle est la taille de 'verseTitles.size()'? – CommonsWare

+0

verseTitles est 139 mais ça pourrait être 250. Mais disons 139. – james0200101

Répondre

0

Vous ne pouvez pas créer un grand nombre de AsyncTask dans une boucle de ce type. Vous pouvez créer un peu plus de 128 avant d'obtenir l'erreur que vous voyez.

Vos options sont:

  1. Ne pas créer des tâches individuelles pour chaque verset. Par exemple, avoir une tâche qui gère tous les versets.

  2. Fournissez votre propre ThreadPoolExecutor personnalisé qui a une plus grande file d'attente pour les tâches en attente, et l'utiliser avec executeOnExecutor() sur AsyncTask. Ne pas utiliser AsyncTask du tout, mais quelque chose d'autre solution d'enfilade d'arrière-plan.

Questions connexes