Das Lesen von jeweils einer Textzeile und das Anhängen dieser Zeile an eine Zeichenfolge ist sowohl beim Extrahieren jeder Zeile als auch beim Overhead so vieler Methodenaufrufe zeitaufwändig.
Ich konnte eine bessere Leistung erzielen, indem ich ein Byte-Array mit angemessener Größe für die Stream-Daten zuordnete, das bei Bedarf iterativ durch ein größeres Array ersetzt wird, und versuchte, so viel zu lesen, wie das Array aufnehmen konnte.
Aus irgendeinem Grund konnte Android wiederholt nicht die gesamte Datei herunterladen, wenn der Code den von HTTPUrlConnection zurückgegebenen InputStream verwendete. Daher musste ich sowohl einen BufferedReader als auch einen handgerollten Timeout-Mechanismus verwenden, um sicherzustellen, dass ich entweder die gesamte Datei erhalten oder abbrechen würde die Übertragung.
private static final int kBufferExpansionSize = 32 * 1024;
private static final int kBufferInitialSize = kBufferExpansionSize;
private static final int kMillisecondsFactor = 1000;
private static final int kNetworkActionPeriod = 12 * kMillisecondsFactor;
private String loadContentsOfReader(Reader aReader)
{
BufferedReader br = null;
char[] array = new char[kBufferInitialSize];
int bytesRead;
int totalLength = 0;
String resourceContent = "";
long stopTime;
long nowTime;
try
{
br = new BufferedReader(aReader);
nowTime = System.nanoTime();
stopTime = nowTime + ((long)kNetworkActionPeriod * kMillisecondsFactor * kMillisecondsFactor);
while(((bytesRead = br.read(array, totalLength, array.length - totalLength)) != -1)
&& (nowTime < stopTime))
{
totalLength += bytesRead;
if(totalLength == array.length)
array = Arrays.copyOf(array, array.length + kBufferExpansionSize);
nowTime = System.nanoTime();
}
if(bytesRead == -1)
resourceContent = new String(array, 0, totalLength);
}
catch(Exception e)
{
e.printStackTrace();
}
try
{
if(br != null)
br.close();
}
catch(IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
EDIT: Es stellt sich heraus , dass , wenn Sie nicht den Inhalt neucodierte haben müssen (dh der Inhalt wollen AS IS ) Sie sollten keine der Reader - Subklassen verwenden. Verwenden Sie einfach die entsprechende Stream-Unterklasse.
Ersetzen Sie den Anfang der vorhergehenden Methode durch die entsprechenden Zeilen der folgenden, um sie zwei- bis dreimal zu beschleunigen .
String loadContentsFromStream(Stream aStream)
{
BufferedInputStream br = null;
byte[] array;
int bytesRead;
int totalLength = 0;
String resourceContent;
long stopTime;
long nowTime;
resourceContent = "";
try
{
br = new BufferedInputStream(aStream);
array = new byte[kBufferInitialSize];