10

Я создал новый проект с одним классом и с помощью следующего кода, взятого из этого примера: https://developers.google.com/app-indexing/android/publish#add-app-indexing-api-callsУтечка памяти с GoogleApiClient детектируется Android Studio

Когда я повернуть устройство в несколько раз, а затем нажмите на Dump Java Heap в Android Studio, а затем нажмите «Анализ». Я получу результат, показывающий, что моя MainActivity просочилась.

Причина, по которой я создал этот примерный проект, заключается в том, что у меня есть существующее приложение, у которого есть проблема с утечкой памяти (StrictMode и Android Studio говорит так), и я пришел к выводу, что это мой код AppIndex, вызывающий проблема.

Это ошибка в Android Studio или это настоящая утечка памяти?

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

Возможно, вам стоит вставить код GoogleApiClient.Builder, так как он ссылается на вашу активность. Я не могу найти какой-либо другой код, который вы публикуете, что может вызвать утечку. – SamMao

+0

OnStop не может быть вызван os, вы должны использовать onPause onResume – greywolf82

ответ

18

кажется GoogleApiClient.Builder(this) вызывает утечку, потому что текущая деятельность в настоящее время хранится клиентом API. mClient.disconnect() не собирается его выпускать. Я решил это для себя, заменив «это» на getApplicationContext(). Контекст приложения работает до тех пор, пока процесс жизни не выполняется.

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

спасибо. Это решило мою утечку памяти. –

+0

Отличное решение! Есть ли отчет об ошибках в трекерах GoogleApiClient? –

+0

Удивительно, что у них есть эта ошибка, спасибо за решение. – meh