对于我的应用程序,我收到要下载并保存到本地存储的URL列表,文件大小从小于1MB到大于50MB不等,文件数量在15-60之间。我通过使用异步任务和以下代码来做到这一点:
new AsyncTask<String, Integer, String>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String etag = "";
Log.v(TAG, "Adding " + url + " to download queue.");
InputStream inputStream;
try {
URL fileURL = new URL(url);
URLConnection urlConnection;
urlConnection = fileURL.openConnection();
etag = urlConnection.getHeaderField("ETag");
inputStream = fileURL.openStream();
DataInputStream dis = new DataInputStream(inputStream);
byte[] buffer = new byte[1024];
int length;
FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "<folderPath>" + fileName);
while ((length = dis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
inputStream.close();
fos.close();
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found.");
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "Error Downloading file " + fileName);
e.printStackTrace();
}
return etag;
}
}.execute();
我什么都没有使用onProgressUpdate,而OnPostExecute Override用于一些UI更新,例如进度条。我将两者都省略了,因为我不认为两者都与GC有关,但是如果需要的话,我将在后面进行介绍。
我也尝试了
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
不只是
.execute();
如图所示。
使用.executeOnExecutor()会导致下载速度更快,因为文件可以一次在池中下载很多文件,但可以提供更多的GC。常规的.execute()速度较慢,但GC的数量较少(仍然很多)。
我的问题:
有人可以解释为什么一种方法比另一种方法导致更多的GC吗?
如何修复下载代码以防止出现这么多GC?