10

1 つのクラスと、この例から取得した次のコードを使用して、新しいプロジェクトを作成しました: https://developers.google.com/app-indexing/android/publish#add-app-indexing-api-calls

デバイスを数回回転させてから、Android Studio で [Dump Java Heap] をクリックし、[Analyse] をクリックします。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();
}

}

4

1 に答える 1

20

GoogleApiClient.Builder(this)現在のアクティビティは API クライアントによって保持されているため、リークが発生しているようです。mClient.disconnect()リリースするつもりはありません。「これ」を に置き換えることで、自分で解決しましたgetApplicationContext()。アプリケーション コンテキストは、プロセスが存続する限り存続します。

mClient = new GoogleApiClient.Builder(getApplicationContext()).addApi(AppIndex.API).build();
于 2016-03-23T22:48:55.433 に答える