Membaca satu baris teks pada satu waktu, dan menambahkan baris kata ke string secara individual memakan waktu baik dalam mengekstraksi setiap baris dan overhead dari begitu banyak doa metode.
Saya bisa mendapatkan kinerja yang lebih baik dengan mengalokasikan byte array berukuran layak untuk menampung data stream, dan yang secara iteratif diganti dengan array yang lebih besar bila diperlukan, dan mencoba membaca sebanyak yang bisa disimpan oleh array.
Untuk beberapa alasan, Android berulang kali gagal mengunduh seluruh file ketika kode menggunakan InputStream yang dikembalikan oleh HTTPUrlConnection, jadi saya harus menggunakan BufferedReader dan mekanisme timeout linting tangan untuk memastikan saya mendapatkan seluruh file atau membatalkan transfer.
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: Ternyata jika Anda tidak perlu menyandikan ulang konten (yaitu, Anda menginginkan konten SEBAGAIMANA ADANYA ), Anda tidak boleh menggunakan subkelas Pustaka apa pun. Cukup gunakan subkelas Stream yang sesuai.
Ganti awal metode sebelumnya dengan garis yang sesuai di bawah ini untuk mempercepatnya 2 hingga 3 kali lipat .
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];