Android-在异步任务中下载多个文件会导致过多的GC

时间:2018-09-19 20:01:44

标签: android android-asynctask download garbage-collection

对于我的应用程序,我收到要下载并保存到本地存储的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的数量较少(仍然很多)。

我的问题:

  1. 有人可以解释为什么一种方法比另一种方法导致更多的GC吗?

  2. 如何修复下载代码以防止出现这么多GC?

GC日志的图片: excessive GC calls

0 个答案:

没有答案