使用Android Studio检测到GoogleApiClient的内存泄漏。

10

我创建了一个新项目,其中只有一个类,并使用以下代码(来自此示例):https://developers.google.com/app-indexing/android/publish#add-app-indexing-api-calls

当我旋转设备多次,然后在Android Studio中点击Dump Java Heap,再点击分析时,将显示我的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。我找不到你发布的其他任何代码会导致泄漏。 - SamMao
OnStop 可能无法被操作系统调用,您应该使用 onPause onResume。 - greywolf82
1个回答

20

看起来是因为API客户端正在保留当前活动,所以 GoogleApiClient.Builder(this) 导致了内存泄漏。调用 mClient.disconnect() 并不能释放它。我通过将 "this" 替换为 getApplicationContext() 来解决了这个问题。应用程序上下文的生命周期与进程一样长。

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

很棒的解决方案!在GoogleApiClient错误跟踪器中有错误报告吗? - Eric Brandwein
太棒了,他们已经解决了这个 bug,感谢提供解决方案。 - meh
你好,如果我在Fragment中,使用getActivity().getApplicationContext()可以吗? - Cliff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接