的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私人课程添加一些代码?
答
您不能在这样的循环中创建大量的AsyncTask
s。在你看到错误之前,你可以创建稍多于128个。
的选项有:
不要为每首诗创建单独的任务。例如,有一个任务可以处理所有的经文。
提供您自己的定制
ThreadPoolExecutor
,该定制具有更大的待处理任务队列,并通过AsyncTask
与executeOnExecutor()
配合使用。根本不要使用
AsyncTask
,而是使用其他后台线程解决方案。
'verseTitles.size()'有多大? – CommonsWare 2014-09-13 12:49:45
verseTitles是139,但它可能高达250.但我们只是说139。 – james0200101 2014-09-13 13:52:54