【发布时间】:2017-11-02 16:52:17
【问题描述】:
我在代码中收到一条警告:
此 AsyncTask 类应该是静态的,否则可能会发生泄漏(匿名 android.os.AsyncTask)
完整的警告是:
此 AsyncTask 类应该是静态的,否则可能会发生泄漏(匿名 android.os.AsyncTask) 静态字段会泄漏上下文。非静态内部类具有对其外部类的隐式引用。如果该外部类例如是 Fragment 或 Activity,则此引用意味着长时间运行的处理程序/加载程序/任务将持有对该 Activity 的引用,从而防止其被垃圾收集。同样,从这些运行时间较长的实例中直接对活动和片段的字段引用可能会导致泄漏。 ViewModel 类不应指向视图或非应用程序上下文。
这是我的代码:
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... params) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
return null;
}
}.execute();
我该如何纠正这个问题?
【问题讨论】:
-
阅读此androiddesignpatterns.com/2013/01/… 应该会提示您为什么它应该是静态的
-
到目前为止,我一直能够在必要时将 AsyncTask 替换为 new Thread(...).statr() 并结合 runOnUiThread(...) ,所以我不必处理不再有这个警告了。
-
kotlin 中针对这个问题的解决方案是什么?
-
请重新考虑哪个答案应该被接受。请参阅下面的答案。
-
在我的例子中,我从没有直接引用 Activity 的单例中收到此警告(它接收
myActivity.getApplication()的输出到单例的私有构造函数中,以便初始化 RoomDB 类和其他类)。我的 ViewModel 将 Singleton 实例作为私有引用,以在数据库上执行一些操作。因此,ViewModel 导入了 Singleton 包以及android.app.Application,其中之一甚至是android.app.Activity。由于“Singleton”不需要导入这些 ViewModel 即可工作,即使如此,是否会发生内存泄漏?
标签: android android-asynctask android-runonuithread