10

Stworzyłem nowy projekt z jednej klasy i z następującego kodu pobranego z tego przykładu: https://developers.google.com/app-indexing/android/publish#add-app-indexing-api-callsprzeciek pamięci z GoogleApiClient wykryte przez Android Studio

Kiedy Obróć urządzenie kilka razy, a następnie kliknąć na Dump Java Heap w Android Studio, a następnie kliknij Analizuj. Otrzymam wynik pokazujący, że moja MainActivity wyciekła.

Powodem, dla którego utworzyłem ten przykładowy projekt jest to, że mam istniejącą aplikację, która ma problem z przeciekiem pamięci (StrictMode i Android Studio tak mówi), a mój wniosek jest taki, że to mój kod AppIndex powoduje problem.

Czy to błąd w Android Studio, czy jest to prawdziwy wyciek pamięci?

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

Może powinieneś zagłębić się w kod GoogleApiClient.Builder, ponieważ odwołuje się do Twojej aktywności. Nie mogę znaleźć innego opublikowanego przez Ciebie kodu, który może spowodować wyciek. – SamMao

+0

OnStop może nie być wywoływany przez OS, powinieneś użyć onPause onResume – greywolf82

Odpowiedz

18

Wydaje GoogleApiClient.Builder(this) jest przyczyną wycieku, ponieważ obecna działalność jest prowadzona przez klienta API. mClient.disconnect() nie zamierza go zwolnić. Rozwiązałem go sam, zastępując "to" przez getApplicationContext(). Kontekst aplikacji funkcjonuje tak długo, jak długo trwa proces.

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

dziękuję. To rozwiązało mój wyciek pamięci. –

+0

Świetne rozwiązanie! Czy istnieje raport o błędzie w narzędziu do śledzenia błędów GoogleApiClient? –

+0

To niesamowite, że mają ten błąd, dzięki za rozwiązanie. – meh