2017-03-16 77 views
0

我聽說the Anonymous Classes can leak memory應將匿名類對象設置爲null onDestroy?

同樣,匿名類也將保持對它們在裏面聲明的類的引用。因此,如果您在活動中匿名聲明並實例化AsyncTask,則可能會發生泄漏。如果它在活動被銷燬後繼續執行後臺工作,那麼活動的引用將會持續存在,直到後臺任務完成後纔會被垃圾收集。

應將匿名類對象設置爲null onDestroy以防止內存泄漏?這裏是我的一些代碼。

public class RegisterActivity extends AppCompatActivity { 
    private ApiHandler registerHandler = null; 
    private static final int SERVICE_REQUEST_REGISTER = 243; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_register); 
     init(); 
    } 

    private void init() { 
     useApiService(); 
     initApiHandler(); 
    } 

    protected void useApiService() { 
     apiService = ApiClient.getClient(getApplicationContext()).create(ApiInterface.class); 
    } 

    private void initApiHandler() { 
     registerHandler = new ApiHandler(this, SERVICE_REQUEST_REGISTER) { 
      @Override 
      protected String successStatusCode() { 
       return "802"; 
      } 

      @Override 
      protected String secretKey() { 
       return getDefaultKey(); 
      } 

      @Override 
      protected boolean isExchangeSecretKey() { 
       return false; 
      } 
     }; 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     registerHandler = null; 
    } 
} 
+0

如果您正在製作一個AsyncTask,並且您知道該活動將被銷燬或可能在進程中被銷燬,那麼在onDestroy()之前調用AsyncTask.cancel() super.onDestroy()...另外,在AsyncTask類的內部,onCancel()內部確保你清除了所有的內容 – MohammedAlSafwan

+0

Nulling引用比人們通常沒有用處認爲,通常不必要。預防勝於治療。不要去掉引用,不要執行GC的工作,仔細確定引用的範圍。不要使用內部類來不恰當地持有對包含類實例的引用。如果你正確地協調對象的生命週期,你將不需要使用kludgey來克服內存管理。 –

回答

0

其實垃圾收集器爲你做。

你所粘貼的一段文字說的是,如果你正在創建開始新的AsyncTask,您在其中創建它永遠不會被破壞的主類匿名類...

換句話說

同時有一個匿名類正在運行的任務onDestroy永遠不會在主類上調用