2013-01-04 6 views
5

Ich lade einen Anhang mithilfe der Java Mail-API herunter, und sobald sich der Netzwerkstatus ändert, bleibt meine App hängen und ich muss sie neu starten, es stürzt nicht einmal ab. Dies ist der Code-Schnipsel:InputStream - Umgang mit Netzwerkänderungen

InputStream is = bodyPart.getInputStream(); 

String fileName = MimeUtility.decodeText(bodyPart.getFileName()); 

// Downloading the file 
File f = new File(Constants.getPath() + fileName); 
try { 
    FileOutputStream fos; 
    fos = new FileOutputStream(f); 

    byte[] buf = new byte[8*1024]; 
    int bytesRead; 

    while ((bytesRead = is.read(buf)) != -1) { 
    fos.write(buf, 0, bytesRead); 
    } 
    fos.close(); 
} 

Was ist der beste Weg, um mit diesem Problem umgehen? Vielen Dank.

+1

Versuchen Sie, den Eingabestream mit 'BufferedInputStream' zu umhüllen und sehen Sie, ob' skip() 'Methode hier unterstützt wird (löst IOException oder nicht). Wenn ja, hätten Sie die Möglichkeit, den vorherigen Download fortzusetzen. –

+0

Hallo, danke, es wirft IOException. Würdest du mir bitte sagen, wie ich den vorherigen Download fortsetzen kann und wie hängt das mit der Tatsache zusammen, dass die App einfriert? – Tsikon

+0

Wenn es 'skip()' unterstützt, würde es 'Vorheriges Herunterladen fortsetzen' unterstützen. Allerdings ist die einzige Option, die ich mir vorstellen kann, eine Zeitüberschreitung bei 'is.read()' zu haben, und sollte das Zeitlimit überschritten werden, sollten Sie den Download beenden und von vorn beginnen. Siehe diese Frage SO: http://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-inputstream-with-a-timeout –

Antwort

1

Ihre Anwendung ist blockiert. Die Lösung besteht darin, ein Lese-Timeout zu setzen, wie in this question beschrieben. Wenn das Zeitlimit auftritt, wird eine SocketTimeoutException ausgelöst.

+0

Ich habe alle folgenden Timeouts: \t props2.setProperty ("mail.imaps.connectionpooltimeout", "3000"); \t props2.setProperty ("mail.imaps.connectiontimeout", "3000"); \t props2.setProperty ("mail.imap.timeout", "3000"); Und immer noch hängt es beim Abrufen von Nachrichtendetails, zum Beispiel message.getSubject(). Seltsamerweise passiert es nur beim Wechsel von 3G zu WI-FI. Wenn ich von WI-FI auf 3g umschalte, löst FolderClosedException aus und dann kann ich damit umgehen. – Tsikon

+0

10 Danke, ich habe es gelöst, indem ich die IMAP in IMAPS in der Timeout-Eigenschaft geändert habe. – Tsikon