2015-10-20 44 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中的視圖),儘管將這些重構爲單獨的類可以使它們更加可重用。

如果答案是「是」,而不是使用非匿名內部類,那麼一個快速而骯髒的測試是「我是否需要爲我的內部類創建我自己的構造函數?」。