2015-10-20 38 views
2

Android Studio提供了很好的重构项目。 但是何时做“将匿名转换为内部”更好?何时使用“将匿名转换为内部”重构?

例如:

  new Thread(new MyRunnable()); 

     private static class MyRunnable implements Runnable { 
      @Override 
      public void run() { 
       // do something 
      } 
     } 
+0

唯一不同的是内当是静态的......在这种情况下,不保存引用外部类......我敢肯定,如果你在'run'中使用外部类的方法/字段,它将不会生成静态类...另一方面,您可以重用这样的类(当然,如果仅使用它一次,它将不适用) – Selvin

回答

1

据我所知,应该使用静态方法来避免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();    
       } 
     } 
    } 
+0

Wouldn'将线程与活动生命周期简单地同步会更好吗?在我看来,一个活动的实例离开onDestroy(或者甚至onPause,取决于它的作用),一个与活动关联的线程不应该运行。 – CurlyCorvus

+0

@CurlyCorvus是的,但是当它运行时你不能从外面停止线程。然后,线程仍然持有你的活动的一个实例,直到线程完成 - >内存泄漏仍然发生。 –

+0

http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java你可以,一个很好的方法是在http://stackoverflow.com/questions/ 3696506 /怎么就杀,一个线程和处理程序,之前持续到新的活动。 – CurlyCorvus

1

这是很容易创建一个内部类的多个实例(通过调用它的构造函数)比创建一个匿名的几个实例:

 new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // do something 
      } 
     }) 

重构后类。

一个更容易回答的问题是How are Anonymous (inner) classes used in Java?,简而言之,要么快速实现一个接口(或抽象类),而不要为接口(或抽象类)增加许多功能,而要想获得强类型的子类另一类将定期建造。

接口/抽象类的一个很好的例子,你通常想要使用匿名内部类是Runnables和大多数Listener接口,因为它们只作为一个代码片段的“给定”给另一个实例类。内部类的好例子是Android或自定义控件中的碎片(Android中的视图),尽管将这些重构为单独的类可以使它们更加可重用。

如果答案是“是”,而不是使用非匿名内部类,那么一个快速而肮脏的测试是“我是否需要为我的内部类创建我自己的构造函数?”。