Android: Trop de fichiers ouverts erreur
J'ai la suite de l'opération qui s'exécute toutes les 3 secondes.
Fondamentalement, il télécharge un fichier à partir d'un serveur et de les enregistrer dans un fichier local toutes les 3 secondes.
Le code suivant fait le travail pendant un certain temps.
public class DownloadTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... params) {
downloadCommandFile( eventUrl);
return null;
}
}
private void downloadCommandFile(String dlUrl){
int count;
try {
URL url = new URL( dlUrl );
NetUtils.trustAllHosts();
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.connect();
int fileSize = con.getContentLength();
Log.d(TAG, "Download file size = " + fileSize );
InputStream is = url.openStream();
String dir = Environment.getExternalStorageDirectory() + Utils.DL_DIRECTORY;
File file = new File( dir );
if( !file.exists() ){
file.mkdir();
}
FileOutputStream fos = new FileOutputStream(file + Utils.DL_FILE);
byte data[] = new byte[1024];
long total = 0;
while( (count = is.read(data)) != -1 ){
total += count;
fos.write(data, 0, count);
}
is.close();
fos.close();
con.disconnect(); //close connection
} catch (Exception e) {
Log.e(TAG, "DOWNLOAD ERROR = " + e.toString() );
}
}
Tout fonctionne bien, mais si je le laisser tourner pendant 5 à 10 minutes, j'obtiens l'erreur suivante.
06-04 19:40:40.872: E/NativeCrypto(6320): AppData::créer pipe(2)
échec: Trop de fichiers ouverts 06-04 19:40:40.892: E/NativeCrypto(6320):
AppData::créer pipe(2) a échoué: Trop de fichiers ouverts 06-04
19:40:40.892: E/EventService(6320): ERREUR de TÉLÉCHARGEMENT =
javax.net.le protocole ssl.SSLException: Impossible de créer les données de l'application
J'ai fait quelques recherches pour les 2 derniers jours.
Il y a des suggestions qu'ils sont nombreux les connexions ouvertes, comme celle-ci https://stackoverflow.com/a/13990490/1503155 encore, mais je n'arrive pas à comprendre quel est le problème.
Les idées de ce que peut provoquer le problème?
Merci à l'avance.
- Avez-vous réussi à finalement de comprendre quel était le problème?
Vous devez vous connecter pour publier un commentaire.
Je pense que vous obtenez cette erreur, parce que vous avez trop de fichiers ouverts en même temps, ce qui signifie que vous avez trop de async tâches en cours d'exécution dans le même temps (chaque async task ouvre un fichier), qui a de sens que si vous dites que vous exécutez une nouvelle toutes les 3 secondes.
Vous devriez essayer de limiter le nombre de async tâche en cours d'exécution dans le même temps à l'aide d'un pool de threads exécuteur testamentaire.
Executor e = Executors.newFixedThreadPool(3)
et puis l'exécution de vos tâches asynchrones :executeOnExecutor(e);