【问题标题】:Memory leak with GoogleApiClient detected by Android StudioAndroid Studio 检测到 GoogleApiClient 的内存泄漏
【发布时间】:2016-02-10 06:22:46
【问题描述】:

我创建了一个新项目,其中包含一个类,并使用此示例中的以下代码: 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();
}

}

【问题讨论】:

  • 也许您应该深入研究 GoogleApiClient.Builder 代码,因为它引用了您的 Activity。我找不到您发布的任何其他可能导致泄漏的代码。
  • 操作系统不能调用 OnStop 你应该使用 onPause onResume

标签: android android-studio memory-leaks google-play-services android-app-indexing


【解决方案1】:

似乎GoogleApiClient.Builder(this) 导致了泄漏,因为当前活动由 API 客户端保存。 mClient.disconnect() 不会发布它。我已经通过用getApplicationContext() 替换“this”为自己解决了这个问题。只要进程存在,应用程序上下文就会存在。

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

【讨论】:

  • 很好的解决方案! GoogleApiClient 错误跟踪器中是否有错误报告?
  • 他们有这个错误真是太神奇了,感谢您的解决方案。
  • 你好,如果我在 Fragment 中? getActivity().getApplicationContext() 可以吗?
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 2012-01-22
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多