我在我的代码中收到警告:
这个AsyncTask类应该是静态的,否则可能会发生泄漏(匿名android.os.AsyncTask)
完整的警告是:
此AsyncTask类应该是静态的,否则可能会发生泄漏(匿名android.os.AsyncTask)静态字段将泄漏上下文.非静态内部类具有对其外部类的隐式引用.如果该外部类例如是片段或活动,则此引用意味着长时间运行的处理程序/加载器/任务将保留对活动的引用,从而阻止其收集垃圾.同样,对来自这些较长时间运行的实例的活动和片段的直接字段引用可能会导致泄漏.ViewModel类绝不应指向视图或非应用程序上下文.
这是我的代码:
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... params) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
return null;
}
}.execute();
Run Code Online (Sandbox Code Playgroud)
我该如何纠正?
我正在查看Java代码,LinkedList并注意到它使用了静态嵌套类Entry.
public class LinkedList<E> ... {
...
private static class Entry<E> { ... }
}
Run Code Online (Sandbox Code Playgroud)
使用静态嵌套类而不是普通内部类的原因是什么?
我能想到的唯一原因是,Entry无法访问实例变量,因此从OOP的角度来看,它具有更好的封装.
但我认为可能有其他原因,也许是表现.可能是什么?
注意.我希望我的条款正确,我会称之为静态内部类,但我认为这是错误的:http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html
我试图在我的AsyncTask中获取名为Opciones的类的上下文(这个类是唯一一个调用该任务的类),但我不知道该怎么做,我看到了一些像这样的代码:
protected void onPostExecute(Long result) {
Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)
但它对我不起作用它说: "No enclosing instance of the type Opciones in scope"