Просто чтобы уточнить, что означает ynsmtki в вашем конкретном случае: ваш asyncTask объявлен в методе обработчика событий / обратного вызова пользовательского интерфейса (назовите его onSomeUIEventHandler {}, но он должен порождать свой собственный поток, содержащий более длинные ссылки на области видимости, такие как(1) progressDialog, (2) DataBase, (3) propertyInfo, которые являются источником предупреждений об утечках.
Как уже отмечали другие, это всегда было тихой проблемой до тех пор, пока IntelliJ не был развернут (фактически выпущен)их анализатор KotlinT два года назад. До недавнего времени (в AS v3.0 +) было непросто разрешить проблему, когда анализатор действительно дает содержательные подсказки по устранению утечки. Вот в чем он теперь помогает и даже генерирует сигнатуры подкласса длячерез IDE:
Таким образом, вам нужно выполнить () этот поток асинхронных задач с копиями только для чтения из указанных выше трех, указав для них методы getter (), а именно getDatabase (), getProgressDialog () и getPropertyInfo(), который вы используете в расширенной asyncTaskкласс таким образом:
static class HandleDBaseAsyncTask extends AsyncTask<Parameterized.Parameters,Process, Result>{
final PropertyInfo propertyInfo = getPropertyInfo();
final YourDatabaseClass Database = getDatabase();
final ProgressDialog progressDialog = getProgressDialog();
// Then finish off with your original
onPreExecute() {...}
doInBackground(){...}
onPostExecute(){...}
}
Затем вернемся к исходному обратному вызову для лидера диалога:
ProgressDialog progressDialog;
ProgressDialog getProgressDialog(){ return progressDialog;}
// and the same for other leakers
onSomeUIEventHandler{
HandleDBaseAsyncTask handleDBTask = new HandleDBaseAsyncTask();
handleDBTask.execute();
// ...
}
Могут быть другие тонкости, чтобы позаботиться о том, где экземпляры методов получателей не могут быть вызваныв статическом контексте задачи, поэтому вы должны сделать их статическими или передать их одноэлементный контейнер (например, Activity или Context) в свой блок asyncTask, чтобы использовать их getter () для выхода из ошибки компилятора.
ParentContainer parent = getDialogContainer();
final ProgressDialog progressDialog = parent.getProgressDialog() // etc