Android Studio提供了很好的重构项目。 但是何时做“将匿名转换为内部”更好?何时使用“将匿名转换为内部”重构?
例如:
new Thread(new MyRunnable());
private static class MyRunnable implements Runnable {
@Override
public void run() {
// do something
}
}
Android Studio提供了很好的重构项目。 但是何时做“将匿名转换为内部”更好?何时使用“将匿名转换为内部”重构?
例如:
new Thread(new MyRunnable());
private static class MyRunnable implements Runnable {
@Override
public void run() {
// do something
}
}
据我所知,应该使用静态方法来避免Memory Leak
。例如:
new Thread(new Runnable() {
@Override
public void run() {
// do something long here
YourActivity.this.doSomething();
}
})
- >当线程运行时关闭应用程序时,上述代码将使您的应用程序出现内存泄漏错误。 然而,随着新的重构就可以避免内存泄漏很容易:
private static class MyRunnable implements Runnable {
WeakReference<YourActivity> activity;
@Override
public void run() {
// do something long
if(activity.get() != null){
activity.get().doSomething();
}
}
}
Wouldn'将线程与活动生命周期简单地同步会更好吗?在我看来,一个活动的实例离开onDestroy(或者甚至onPause,取决于它的作用),一个与活动关联的线程不应该运行。 – CurlyCorvus
@CurlyCorvus是的,但是当它运行时你不能从外面停止线程。然后,线程仍然持有你的活动的一个实例,直到线程完成 - >内存泄漏仍然发生。 –
http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java你可以,一个很好的方法是在http://stackoverflow.com/questions/ 3696506 /怎么就杀,一个线程和处理程序,之前持续到新的活动。 – CurlyCorvus
这是很容易创建一个内部类的多个实例(通过调用它的构造函数)比创建一个匿名的几个实例:
new Thread(new Runnable() {
@Override
public void run() {
// do something
}
})
重构后类。
一个更容易回答的问题是How are Anonymous (inner) classes used in Java?,简而言之,要么快速实现一个接口(或抽象类),而不要为接口(或抽象类)增加许多功能,而要想获得强类型的子类另一类将定期建造。
接口/抽象类的一个很好的例子,你通常想要使用匿名内部类是Runnables和大多数Listener接口,因为它们只作为一个代码片段的“给定”给另一个实例类。内部类的好例子是Android或自定义控件中的碎片(Android中的视图),尽管将这些重构为单独的类可以使它们更加可重用。
如果答案是“是”,而不是使用非匿名内部类,那么一个快速而肮脏的测试是“我是否需要为我的内部类创建我自己的构造函数?”。
唯一不同的是内当是静态的......在这种情况下,不保存引用外部类......我敢肯定,如果你在'run'中使用外部类的方法/字段,它将不会生成静态类...另一方面,您可以重用这样的类(当然,如果仅使用它一次,它将不适用) – Selvin