2017-03-16 3 views
0

Ich habe gehört, dass the Anonymous Classes can leak memory.Sollte das anonyme Klassenobjekt auf onDestroy auf null gesetzt werden?

In ähnlicher Weise werden anonyme Klassen auch einen Verweis auf die Klasse beibehalten, in der sie deklariert wurden. Daher kann ein Leck auftreten, wenn Sie eine AsyncTask anonym in Ihrer Aktivität deklarieren und instanziieren. Wenn die Hintergrundaktivität nach dem Löschen der Aktivität fortgesetzt wird, bleibt der Verweis auf die Aktivität bestehen und es wird erst nach Abschluss der Hintergrundaufgabe eine Garbage-Collection durchgeführt.

Sollte das anonyme Klassenobjekt auf null onDestroy gesetzt werden, um Speicherlecks zu verhindern? Hier sind einige Teile meines Codes.

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

Wenn Sie eine AsyncTask erstellen und Sie wissen, dass die Aktivität zerstört wird oder in dem Prozess zerstört wird, dann rufen Sie AsyncTask.cancel() innerhalb von onDestroy() vor the super.onDestroy() ... Auch innerhalb Ihrer AsyncTask-Klasse, innerhalb von onCancel() stellen Sie sicher, dass Sie alles löschen – MohammedAlSafwan

+0

Nulling Referenzen ist weniger nützlich als Menschen in der Regel denke, normalerweise unnötig. Vorbeugen ist besser als heilen. Anstatt Referenzen zu nullen, tun Sie nicht GCs Arbeit, sondern legen Sie Ihre Referenzen sorgfältig fest. Verwenden Sie keine inneren Klassen, um Referenzen auf die Instanzen von Klassen unangemessen zu halten. Wenn Sie die Objektlebensdauern richtig koordinieren, werden Sie keine Kluddy-Hacks benötigen, um die Speicherverwaltung zu koordinieren. –

Antwort

0

Eigentlich Müllkoelektor tun es für Sie.

Was das Stück Text eingefügt sagt, wenn die Anonymous-Klasse eine neue AsyncTask starten erstellen, die Hauptklasse, wo Sie es erstellt wird nie ...

mit anderen Worten zerstört werden, während es einen gibt Anonyme Klasse, die Aufgaben onDestroy ausführt, wird nie auf Hauptklasse aufgerufen

Verwandte Themen