应用程序在旋转时崩溃,没有堆栈跟踪

5
我正在使用一个包含Activity和两个Fragments(android.support.v4.app.Fragment)的应用程序,但是我遇到了一个非常奇怪的问题。问题是当我旋转平板电脑时,应用程序会立即崩溃。
几天前,一切都正常运行,但我不得不更改软件包名称,这引发了一些错误,但我设法纠正了它们。问题出现在那之后,但我就是找不到错误所在的地方。以下是应用程序被销毁、重新启动、恢复和创建后获取的Logcat日志:
10-08 17:00:14.930: D/dalvikvm(18155): GC_CONCURRENT freed 394K, 8% free 7792K/8455K,  paused 1ms+4ms
10-08 17:00:14.930: D/AndroidRuntime(18155): Shutting down VM
10-08 17:00:14.930: W/dalvikvm(18155): threadid=1: thread exiting with uncaught exception (group=0x40bee1f8)
10-08 17:00:14.938: E/AndroidRuntime(18155): FATAL EXCEPTION: main
10-08 17:00:14.938: E/AndroidRuntime(18155): java.lang.IllegalStateException: No activity
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1065)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1854)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:431)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.support.v4.app.FragmentActivity$1.handleMessage(FragmentActivity.java:90)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.os.Looper.loop(Looper.java:137)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at android.app.ActivityThread.main(ActivityThread.java:4514)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at java.lang.reflect.Method.invokeNative(Native Method)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at java.lang.reflect.Method.invoke(Method.java:511)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
10-08 17:00:14.938: E/AndroidRuntime(18155):    at dalvik.system.NativeStart.main(Native Method)

问题来自FragmentManager,但为什么我不知道,因为我没有任何细节。我尝试了在这个网站上找到的解决方案来获取更多信息,通过捕获未捕获的异常,但我得到的结果是相同的Logcat一遍又一遍,直到发生某种内存不足错误(logcat中有太多字符串)。

我的Activity布局如下,它在android生命周期中工作正常,但不适用于屏幕旋转:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:id = "@+id/mainview"
    tools:context=".MyActivity" >

    <fragment
        android:id="@+id/missionFragment"
        android:layout_width="350dip"
        android:layout_height="match_parent"
        android:layout_marginTop="?android:attr/actionBarSize"
        android:name="com.xxx.xxx.MissionFragment">       
    </fragment>

    <fragment
        android:id="@+id/mapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.xxx.xxx.MapFragment">
    </fragment>

</LinearLayout>

清单就在这里:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.xxx"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="11" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:icon="@drawable/logo"
        android:label="@string/app_name" >
        <activity
            android:name=".MySIGActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="stateHidden" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

如果有人知道错误出现在哪个Android生命周期方法中,欢迎提供意见!

谢谢。

更新1.1: 这是我的主Activity的onCreate方法:

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

    context = getApplicationContext();
    currentEtape = 1;

    // Set up the action bar.
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    // Désactiver l'affichage du titre de l'application et son icône
    actionBar.setDisplayShowHomeEnabled(true);
    actionBar.setDisplayShowTitleEnabled(true);

    setContentView(R.layout.main);  

    SharedPreferences prefs = getPreferences(0);
    trackingGPS = prefs.getBoolean("trackingGPS", false);
    if(trackingGPS){
        TextView viewTrackingActive = (TextView)findViewById(R.id.textview_notif_tracking);
        viewTrackingActive.setText(this.getString(R.string.active));
        viewTrackingActive.setTextColor(Color.parseColor("#99CC00"));
    }
    else{
        TextView viewTrackingDesactive = (TextView)findViewById(R.id.textview_notif_tracking);
        viewTrackingDesactive.setText(this.getString(R.string.desactive));
        viewTrackingDesactive.setTextColor(Color.parseColor("#CC0000"));
    }

    // No interaction with Fragment or Activity classes in these methods
    instanciateLayersDialog();
    instanciateBasemapDialog();

}

关于 onResume 方法:

public void onResume(){
            super.onResume();
            SharedPreferences prefs = getPreferences(0);
            trackingGPS = prefs.getBoolean("trackingGPS", false);
            System.out.println("activity resume");
}

2
你没有放置任何FragmentActivity的信息,这应该会有所帮助。特别是OnCreate和onResume。 无论如何,我曾经遇到过非常令人沮丧的类似问题:其中一个是内存泄漏;在模拟器中,我在屏幕旋转时收到了跳跃错误消息,但在htc desire上没有收到。其次,android.support.v4.app.FragmentManager的某些方法与android.FragmentManager冲突,因此在没有v4支持的项目中复制粘贴时,会出现这种错误。您是否检查过您正在使用哪个?尝试使用完全限定名称并放置一些代码。 - quinestor
1
感谢您的快速回复。我正在使用v4支持中的FragmentManager,我仔细检查了一下,没有基本的FragmentManager引用...我希望问题可能来自那里,但不是这样。我将更新我的帖子以添加onCreate和OnResume。 - user842539
我的猜测是:这可能是您使用的模拟器出了问题。创建新的AVD(新的模拟器实例)和/或尝试其他物理手机。如果这样仍然不行,那么我们应该看一下您所拥有的活动。您有一个主要活动和...? - quinestor
顺便问一下,Sysyem.out.println?你是指Log.d(event,sting)吗?;) - quinestor
是的,但移除支持包并不是一个解决方案!我遇到了同样的问题,在实际设备(Xoom)上进行替换事务时,当我对已经添加过一次且不会被重新添加的片段进行操作时。(在FrameLayout中交换片段) - Adam
显示剩余4条评论
2个回答

13
我不确定这是否解决了原帖作者的问题,但当我在我的主Activity中有一个如下所示的onPause()方法时,我也遇到了同样的问题:
@Override
public void onPause() {
    super.onResume();

    ...do other stuff...
}

你可以看到,这只是一个打字错误,但由于错误信息“没有活动”太模糊了,我花了一些时间来追踪它。(如果不明显,“super.onResume”应该改为“super.onPause”)。

如果这不是你的确切问题,我相信它与原始片段没有被正确销毁有关(在我的情况下是由于未调用适当的onPause()函数)。


这应该是正确答案。它帮助我解决了我已经担心了几个小时的问题。 - Vinay S Shenoy
这也会发生在从飞行模式切换回来后,活动和片段重新构建时。干得好,雷纳德。 - robotoaster
有趣的是,我也遇到了完全相同的问题! :) - sorin.silaghi

-6
我找到了问题: android.support.v4.app 包 是原因。我用来自 android.app 包的标准 Fragment 导入替换了所有导入。
使用这个包,我的兼容性向 Android 2.0 分支被打破了,但在我的情况下这不是问题。

4
当答案是“支持库损坏”时,接受自己的答案相当无聊,至少要保持问题开放直到有真正的答案出现。 - HaMMeReD

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