10

ich ein neues Projekt mit einer Klasse erstellt haben, und mit dem folgenden Code aus diesem Beispiel genommen: https://developers.google.com/app-indexing/android/publish#add-app-indexing-api-callsSpeicherleck mit GoogleApiClient erkannt von Android Studio

Wenn i Drehen Sie das Gerät mehrmals und klicken Sie dann auf Dump Java Heap in Android Studio und dann auf Analysieren klicken. Ich werde ein Ergebnis bekommen, das zeigt, dass meine MainActivity durchgesickert ist.

Der Grund, warum ich dieses Beispielprojekt erstellt habe, ist, weil ich eine vorhandene App habe, die ein Memory Leak-Problem hat (StrictMode und Android Studio sagt), und meine Schlussfolgerung ist, dass es meine AppIndex-Code sind Problem.

Ist es ein Fehler in Android Studio oder ist es ein echtes Speicherleck?

public class MainActivity extends AppCompatActivity { 


private GoogleApiClient mClient; 
private Uri mUrl; 
private String mTitle; 
private String mDescription; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mClient = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
    mUrl = Uri.parse("http://examplepetstore.com/dogs/standard-poodle"); 
    mTitle = "Standard Poodle"; 
    mDescription = "The Standard Poodle stands at least 18 inches at the withers"; 
} 


public Action getAction() { 
    Thing object = new Thing.Builder() 
      .setName(mTitle) 
      .setDescription(mDescription) 
      .setUrl(mUrl) 
      .build(); 

    return new Action.Builder(Action.TYPE_VIEW) 
      .setObject(object) 
      .setActionStatus(Action.STATUS_TYPE_COMPLETED) 
      .build(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    mClient.connect(); 
    AppIndex.AppIndexApi.start(mClient, getAction()); 
} 

@Override 
public void onStop() { 
    AppIndex.AppIndexApi.end(mClient, getAction()); 
    mClient.disconnect(); 
    super.onStop(); 
} 

}

+0

Vielleicht sollten Sie in den GoogleApiClient.Builder-Code eintauchen, da er auf Ihre Aktivität verweist. Ich kann keinen anderen Code finden, den Sie veröffentlichen, der ein Leck verursachen kann. – SamMao

+0

OnStop konnte nicht von os aufgerufen werden Sie sollten onPause onResume – greywolf82

Antwort

18

Es scheint GoogleApiClient.Builder(this) das Leck verursacht, weil aktuelle Aktivität wird durch API-Client gehalten wird. mClient.disconnect() wird es nicht freigeben. Ich habe es für mich selbst gelöst, indem ich "dieses" durch getApplicationContext() ersetzte. Der Anwendungskontext bleibt so lange bestehen, wie der Prozess läuft.

+0

danke verwenden. Dies löste mein Speicherleck. –

+0

Große Lösung! Gibt es im GoogleApiClient Bug Tracker einen Fehlerbericht? –

+0

Es ist erstaunlich, dass sie diesen Bug haben, danke für die Lösung. – meh

Verwandte Themen