的Android的Java - 的ThreadPoolExecutor $ AbortPolicy

的Android的Java - 的ThreadPoolExecutor $ AbortPolicy

问题描述:

我收到以下错误:

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) 

而下面是我的代码:

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) {} 
    } 

我执行这样的代码:

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

我在想这可能是一个简单的解决方案,需要向我的DownloadVerses私人课程添加一些代码?

+0

'verseTitles.size()'有多大? – CommonsWare 2014-09-13 12:49:45

+0

verseTitles是139,但它可能高达250.但我们只是说139。 – james0200101 2014-09-13 13:52:54

您不能在这样的循环中创建大量的AsyncTask s。在你看到错误之前,你可以创建稍多于128个。

的选项有:

  1. 不要为每首诗创建单独的任务。例如,有一个任务可以处理所有的经文。

  2. 提供您自己的定制ThreadPoolExecutor,该定制具有更大的待处理任务队列,并通过AsyncTaskexecuteOnExecutor()配合使用。

  3. 根本不要使用AsyncTask,而是使用其他后台线程解决方案。