1

I know there's a ton of questions about memory leaks and orientation changes. I've spent hours looking and testing trying to figure out what exactly is going on. I've paired my app down to an activity and a dialog fragment. The dialog fragment disappears at orientation change. I know that and know how to handle it. I was just trying to get down to the smallest amount of code. When I tap the spinner to expand it, and then change orientation, I get a memory leak. Without it expanded, the dialog just disappears -- which is fine for now.

Can anyone see why I an expanded Spinner would give a memory leak on orientation change? Is it me or an android bug I have to work around?

Here's my app code:

testing Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.danlconsulting.testing"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />

<application >
    <activity
        android:name=".MainActivity"
        android:label="Main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

MainActivity.java

package com.danlconsulting.testing;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyDialogFragment myDialog = new MyDialogFragment();
        myDialog.show(getSupportFragmentManager(), "dlg");
    }
}

MyDialogFragment.java

package com.danlconsulting.testing;

import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MyDialogFragment extends DialogFragment{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_fragment,container,false);
    }  
}

dialog_fragment.xml

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >


    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minWidth="1000dp"       
        android:orientation="vertical" >

        <Spinner
            android:id="@+id/inputSpinner"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="0.07" />

    </LinearLayout>

</ScrollView>

And activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="4dip"
     android:paddingBottom="6dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">
</LinearLayout>

EDIT: Of course I just saw another question that seems to be the same.

Spinner drop-down list and screen orientation change problem

But, I thought adding the android:configChanges="keyboardHidden|orientation" was not the desired solution??

My LOGCAT:

11-07 14:59:34.834: E/WindowManager(14250): Activity com.danlconsulting.testing.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40531e60 that was originally added here 11-07 14:59:34.834: E/WindowManager(14250): android.view.WindowLeaked: Activity com.danlconsulting.testing.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40531e60 that was originally added here 11-07 14:59:34.834: E/WindowManager(14250): at android.view.ViewRoot.(ViewRoot.java:273) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:174) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:117) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.Window$LocalWindowManager.addView(Window.java:424) 11-07 14:59:34.834: E/WindowManager(14250): at android.app.Dialog.show(Dialog.java:241) 11-07 14:59:34.834: E/WindowManager(14250): at android.app.AlertDialog$Builder.show(AlertDialog.java:823) 11-07 14:59:34.834: E/WindowManager(14250): at android.widget.Spinner.performClick(Spinner.java:265) 11-07 14:59:34.834: E/WindowManager(14250): at android.view.View$PerformClick.run(View.java:9299) 11-07 14:59:34.834: E/WindowManager(14250): at android.os.Handler.handleCallback(Handler.java:587) 11-07 14:59:34.834: E/WindowManager(14250): at android.os.Handler.dispatchMessage(Handler.java:92) 11-07 14:59:34.834: E/WindowManager(14250): at android.os.Looper.loop(Looper.java:130) 11-07 14:59:34.834: E/WindowManager(14250): at android.app.ActivityThread.main(ActivityThread.java:3691) 11-07 14:59:34.834: E/WindowManager(14250): at java.lang.reflect.Method.invokeNative(Native Method) 11-07 14:59:34.834: E/WindowManager(14250): at java.lang.reflect.Method.invoke(Method.java:507) 11-07 14:59:34.834: E/WindowManager(14250): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 11-07 14:59:34.834: E/WindowManager(14250): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) 11-07 14:59:34.834: E/WindowManager(14250): at dalvik.system.NativeStart.main(Native Method)

Community
  • 1
  • 1
mary
  • 174
  • 10
  • Just curious, what is your error log says, and why do you think `android:configChanges="keyboardHidden|orientation"` is not the desired solution? – Wenhui Nov 07 '12 at 23:01
  • I've read a few places on here that made me think it was a sort of hack. However it does solve my problem, I just wondered if I was creating more problems. – mary Nov 08 '12 at 15:06
  • If you are going to support sdk 13 and later, you should add screenSize flag to android:configChanges, otherwise it won't work, it will be `android:configChanges="keyboardHidden|orientation|screenSize"`, here is the [official docs](http://developer.android.com/guide/topics/manifest/activity-element.html#config) – Wenhui Nov 08 '12 at 17:24
  • Your error log shows you have windowLeak, that is because you didn't dismiss your dialog. If you don't add `android:configChanges="keyboardHidden|orientation|screenSize"` to your , when you change your orientation, your activity will be restarted, so dialog window didn't get closed, that is why the error log shows you have windowleak. – Wenhui Nov 08 '12 at 17:27
  • @Wenhui Where would I dismiss the dialog? – mary Nov 12 '12 at 18:49

1 Answers1

2
    private MyDialogFragment myDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        myDialog = new MyDialogFragment();
        myDialog.show(getSupportFragmentManager(), "dlg");
    }

    @Override
    public void onConfigurationChanged( Configuration newConfig ) {
        super.onConfigurationChanged( newConfig );
        if( !myDialog.isHidden() ){
            myDialog.dismiss();
        }
    }
Wenhui
  • 648
  • 4
  • 13