不是一定要用static声明为静态类,但是推荐作为内部静态类,因为内部类会隐式持有外部类的引用,有些时候如果代码处理不对容易造成内存泄漏
下面就是个内存泄漏的例子
public class MainActivity extends Activity {
public class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
new Thread(){
@Override
public void run() {
while(true){
//do something
}
}
}.start();
}
}
}
public MyHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
handler.sendEmptyMessage(1);
finish();
}
}
如上面代码所示,在onCreate方法里发送了一条消息给handler处理然后finish方法关闭activity,但是代码并不能如愿,因为在handler收到消息启动了一个线程并且是死循环,
这时候Thread持有handler的引用,而handler又持有activity的引用,这就导致了handler不能回收和activty也不能回收,所以推荐使用静态内部类,因为静态内部类不持有外部类的引用,可以避免这些不必要的麻烦
静态内部类可以在生成对象的时候,不需要外部类对象,它的目的可能是为了把一个类隐藏在另一个类中或者是为了防止在一个大项目中多个类的重名 简单的说,声明为静态的内部类和一个普通类的功能是一样的,就可以把它当作一个普通的类一样使用
具体原因如楼上所述,但是有一点是如果使用Fragment的内部类,要声明为静态内部类,不然运行时会报错:“MyFragment must be a public static class to be properly recreated from instance state.”而在编译时不报错。Fragment不能用作匿名内部类不然也会报同样的错误,原因也是要使用静态内部类。此外,使用静态内部类时不持有外部类的引用可以避免内存泄漏。使用静态内部类时,强烈推荐不要声明带参数的构造方法,因为在后续声明该类的对象时必须传递参数,会带来一些不必要的麻烦。