java - 如何解决警告: This AsyncTask class should be static or leaks might occur

标签 java android

我有以下代码:

    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.

尝试查看以前的线程,但没有找到解决方案。如果我将类设为静态,则无法调用 getContentResolver()uploadData(bytes)。如何解决?

最佳答案

你显然正在处理内部类。它保留对托管类的引用,在您的情况下,它是生命周期感知的东西,例如 Activity 或 fragment 。您需要做的是:

  1. 首先不要使用 AsyncTask(开玩笑,但持保留态度)
  2. 按照规定将 ImageCompressTask 设为静态
  3. 是否可以选择不将内容解析器作为参数传递,而是向异步任务提供 ImagePicker.getBitmap(getContentResolver(),uris[0]) 的结果?
  4. 您是否也在 doInBackground 中进行网络、压缩等操作,仅使用 onPostExecute 来对任何相关结果进行后处理。

关于java - 如何解决警告: This AsyncTask class should be static or leaks might occur,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62479319/

相关文章:

java - JTree - 如何将背景设置为节点

java - 如何将充满 if 语句的 for 循环更改为更优雅/高效的代码?

java - Eclipse java 断点 - 目的是什么?

android - Linux驱动和安卓驱动有什么区别

android - 无法将 fragment View 切换到主视图

java - 如何正确选择json结构

java - 数组在 Android 的 Spinner 中不保存值

java - Android 保存语音到文本音频

android - 版本控制可以忽略Android中的bin文件夹吗?

android - GLES10.glGetIntegerv 在三星设备上返回 0