10

ho creato un nuovo progetto con una classe e con il seguente codice preso da questo esempio: https://developers.google.com/app-indexing/android/publish#add-app-indexing-api-callsPerdita di memoria con GoogleApiClient rilevato da Android Studio

Quando ho ruotare il dispositivo più volte e poi clicco su Dump Java Heap in Android Studio e quindi fare clic su Analizza. Otterrò un risultato che mostra che la mia MainActivity è trapelata.

Il motivo per cui ho creato questo progetto di esempio, è perché ho un'app esistente che ha un problema di perdita di memoria (lo dice StrictMode e Android Studio), e la mia conclusione è che è il mio codice AppIndex a causare il problema.

Si tratta di un bug in Android Studio o si tratta di una perdita di memoria reale?

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

Forse dovresti scavare nel codice GoogleApiClient.Builder, perché fa riferimento alla tua attività. Non riesco a trovare nessun altro codice pubblicato che possa causare una perdita. – SamMao

+0

OnStop potrebbe non essere chiamato da os, dovresti usare onPause onResume – greywolf82

risposta

18

Sembra GoogleApiClient.Builder(this) sta causando la perdita, perché l'attività corrente viene tenuto da API client. mClient.disconnect() non lo rilascerà. L'ho risolto da solo sostituendo "questo" con getApplicationContext(). Il contesto dell'applicazione dura finché dura il processo.

mClient = new GoogleApiClient.Builder(getApplicationContext()).addApi(AppIndex.API).build(); 
+0

grazie. Questo ha risolto la mia perdita di memoria. –

+0

Ottima soluzione! C'è un bug report nel bug tracker di GoogleApiClient? –

+0

È incredibile che abbiano questo bug, grazie per la soluzione. – meh