【问题标题】:Activilty has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42acff18 that was originally added hereActivilty 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@42acff18
【发布时间】:2015-12-01 23:39:00
【问题描述】:

我正在使用 LiveSDK for Onedrive 登录。它正在工作,但在签名页面和授权页面上的旋转设备上显示警告。

Activilty 泄露了原本添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@42acff18......

代码如下

class SigninActivity extends Activity implements LiveAuthListener {
private LiveAuthClient signinauth;
public LiveConnectClient client;
private boolean signin = false;
public static final String[] SCOPES = {
        "wl.signin",
        "wl.basic",

};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_in);
}

@Override
public void onResume() {
    super.onResume();
    if (this.signinauth == null) {
        this.signinauth = new LiveAuthClient(this, LiveSdkContants.CLIENT_ID);
        this.signinauth.login(this, Arrays.asList(SCOPES), this);
    }
    if (signin) {
        System.out.println("Authorization Success");
        finish();
    }
}
public void onDestroy() {
    super.onDestroy();

}
public void onAuthComplete(LiveStatus status, LiveConnectSession session, Object userState) {
    if (status == LiveStatus.CONNECTED ) {
        System.out.println("Connected");
        signin = true;
        client = new LiveConnectClient(session);
        finish();
    } else {
        client = null;
        signin = false;
        finish();
    }
}

        public void onAuthError(LiveAuthException exception, Object userState) {
    client = null;
    System.out.println("Connection failed");
    this.finish();
}

我该如何解决这个问题?

Activity 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@41d3cf88 在 android.view.ViewRootImpl.(ViewRootImpl.java:402) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:311) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 在 android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 在 android.view.Window$LocalWindowManager.addView(Window.java:554) 在 android.app.Dialog.show(Dialog.java:277) 在 com.microsoft.live.AuthorizationRequest.execute(AuthorizationRequest.java:344) 在 com.microsoft.live.LiveAuthClient.login(LiveAuthClient.java:504) 在 com.microsoft.live.LiveAuthClient.login(LiveAuthClient.java:427) 在 com.onedrive.SigninActivity.onResume(SigninActivity.java:303) 在 android.support.v4.app.Fragment.performResume(Fragment.java:1832) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:995) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1120) 在 android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1939) 在 android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:447) 在 android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:436) 在 android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:138) 在 android.app.Activity.performResume(Activity.java:5293) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2606) 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2644) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2130) 在 android.app.ActivityThread.access$600(ActivityThread.java:140) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:4898) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 在 dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我建议您在您的应用程序上安装 Leakcanary 并查看内存泄漏发生的位置。这是 github 链接:github.com/square/leakcanary
  • 请提供您的堆栈跟踪 logcat 以强制关闭
  • 此 onedrive 登录是否会打开一个关于您的活动的新对话框? Bcoz 当您更改方向时,活动将被销毁并再次创建……关联的上下文对象也是如此。上下文用于将视图与活动相关联。
  • 我添加了堆栈跟踪。我的理解是来自 LiveSDK 库的登录和授权对话框。我们如何才能关闭它?

标签: android onedrive live-sdk


【解决方案1】:

当您的父级 Activity 打开任何亲属 Foreground 时,就会出现此异常。如果 Parent 活动停止,而不关闭 DialogActivity 将出现上述错误。

注意事项: (1) 您应该每次都检查onStop() 方法,如果您的对话框已打开,则首先关闭该对话框。

(2)在你的Activity调用finish()之前,每次打开Dialog都应该关闭它

【讨论】: