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;
}
}
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
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. –