java - Android Java - ThreadPoolExecutor$AbortPolicy

标签 java android android-asynctask

我收到以下错误:

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 私有(private)类添加一些代码?

最佳答案

您无法在这样的循环中创建大量 AsyncTask。您可以创建略多于 128 的数量,然后才会出现您所看到的错误。

您的选择是:

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

  2. 提供您自己的自定义 ThreadPoolExecutor,它具有更大的待处理任务队列,并将其与 AsyncTask 上的 executeOnExecutor() 一起使用.

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

关于java - Android Java - ThreadPoolExecutor$AbortPolicy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25823406/

相关文章:

android - ListView 中的 ImageViews 不显示

android - 如何通过异步任务传递参数?

java - System.arrayCopy 很慢

java - 为什么 jersey-bundle 1.17.1 中的 asm 提供了作用域?

java - 字符串上的正则表达式,用于匹配和匹配,无论顺序如何

java - Spring security oAuth 2.0(无效 token 不包含资源id(oauth2-resource))

android - 添加 Toast 消息关闭时的回调

android - 如何设置我的选项菜单,使每行只有 2 个按钮?

java - 在 FirebaseAuth android 中添加额外的个人资料信息

android - 服务与 AsyncTask