Как устранить предупреждение: этот класс AsyncTask должен быть stati c, иначе могут возникнуть утечки - PullRequest
0 голосов
/ 20 июня 2020

У меня есть следующий код:

    private class ImageCompressTask extends AsyncTask<Uri, Integer, byte[]> {

        @Override
        protected byte[] doInBackground(Uri... uris) {
            Bitmap bitmap = ImagePicker.getBitmap(getContentResolver(),uris[0]);
            if (bitmap == null) {
                return null;
            }
            Log.d(this.getClass().getName(), "doInBackground: MBs before compression: " + (double) bitmap.getByteCount() / 1e6);
            byte[] bytes = getBytesFromBitmap(bitmap, 80);
            Log.d(this.getClass().getName(), "doInBackground: MBs after compression: " + (double) bytes.length / 1e6);
            return bytes;
        }

        @Override
        protected void onPostExecute(byte[] bytes) {
            super.onPostExecute(bytes);
            uploadData(bytes);
        }

        private byte[] getBytesFromBitmap(Bitmap bitmap, int quality) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream);
            return stream.toByteArray();
        }
    }

Он в основном загрузил изображение в хранилище и новый документ в базу данных (firebase). Я получаю предупреждение:

This `AsyncTask` class should be static or leaks might occur.

Пытался просмотреть предыдущие темы, но не нашел там решения. Если я сделаю класс stati c, я не смогу вызвать getContentResolver() и uploadData(bytes). Как решить?

1 Ответ

0 голосов
/ 20 июня 2020

Очевидно, вы имеете дело с внутренним классом. Он сохраняет ссылку на класс хостинга, в вашем случае это что-то, что известно о жизненном цикле, например, активность или фрагмент. Что вам нужно сделать, это:

  1. Не использовать AsyncTask в первую очередь (шутка, но с долей скепсиса)
  2. Сделайте свой ImageCompressTask stati c как заявлено
  3. Можно ли не передавать преобразователь содержимого в качестве аргумента, а вместо этого предоставлять задачу Asyn c с результатом ImagePicker.getBitmap(getContentResolver(),uris[0])?
  4. Вы используете сеть, сжатие также внутри doInBackground, используйте onPostExecute только для последующей обработки любых релевантных результатов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...