我有以下代码:
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 。您需要做的是:
- 首先不要使用 AsyncTask(开玩笑,但持保留态度)
- 按照规定将 ImageCompressTask 设为静态
- 是否可以选择不将内容解析器作为参数传递,而是向异步任务提供
ImagePicker.getBitmap(getContentResolver(),uris[0])
的结果? - 您是否也在
doInBackground
中进行网络、压缩等操作,仅使用onPostExecute
来对任何相关结果进行后处理。
关于java - 如何解决警告: This AsyncTask class should be static or leaks might occur,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62479319/