【问题标题】:after calling around 30 times fragmentTransaction.replace() the FragmentActivity is unexpectedly closing在调用了大约 30 次 fragmentTransaction.replace() 后,FragmentActivity 意外关闭
【发布时间】:2016-12-11 11:33:14
【问题描述】:

我有一个测试应用程序,它的问题存储在数据库中。我的 FragmentActivity 包含一个片段,当从 AppBar 中选择新问题时,该片段将被替换。当我选择一个新问题大约 30 次时,FragmentActivity 意外关闭并将我带到我之前返回堆栈中的 Activity。

在 Verbose 级别的 Logcat 上,我没有看到任何与我的应用程序相关的内容。

我的xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<RelativeLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/buttonshape"
    android:orientation="horizontal">

    <HorizontalScrollView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/linearLayoutAppbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

        </LinearLayout>
    </HorizontalScrollView>

    <ImageView
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:src="@drawable/s202_background" />
</LinearLayout>

RelativeLayout 在调用 fragmentTransaction.replace() 时总是被片段替换; 在下面的 LinearLayout 中是我的 AppBar,它以编程方式创建了代表数据库中每个问题的按钮。

当一个按钮被点击时 OnClickListener 被调用并识别哪个按钮被点击然后在一个新的方法中调用 fragmentTransaction.replace(); 这是该方法的代码:

    private void question1() {
    testPrasanjaCursor = BazaNaPrasanja.testDatabase.query(VozackaDbContract.TABLE_NAME_TABELA_TEST, null, null, null, null, null, null);
    fragmentTransaction = fragmentManager.beginTransaction();
    testPrasanjaCursor.moveToPosition(0);

    fragmentTransaction.replace(R.id.fragment_container, fragmentZnaci4);
    fragmentTransaction.commit();
    testPrasanjaCursor.close();
}

我不知道是 Sqlite 数据库导致它还是 FragmentManager 导致我在 Verbose 中没有与我的 Appliaction 相关的任何信息。

编辑: 添加了 Logcat,这里是所有 logcat,因为我在 Emulator 上单击运行直到它关闭 FragmentActivity:

12-11 13:33:48.802 1722-1722/? I/art: Not late-enabling -Xcheck:jni (already on)
12-11 13:33:48.803 1722-1722/? W/art: Unexpected CPU variant for X86 using defaults: x86_64
12-11 13:33:48.906 1722-1722/mojavozacka.testovi_za_vozacka_dozvola W/System: ClassLoader referenced unknown path: /data/app/mojavozacka.testovi_za_vozacka_dozvola-2/lib/x86_64
12-11 13:33:48.918 1722-1722/mojavozacka.testovi_za_vozacka_dozvola I/InstantRun: Instant Run Runtime started. Android package is mojavozacka.testovi_za_vozacka_dozvola, real application class is null.
12-11 13:33:49.203 1722-1722/mojavozacka.testovi_za_vozacka_dozvola W/System: ClassLoader referenced unknown path: /data/app/mojavozacka.testovi_za_vozacka_dozvola-2/lib/x86_64
12-11 13:33:49.353 1722-1722/mojavozacka.testovi_za_vozacka_dozvola W/art: Verification of java.lang.Object mojavozacka.testovi_za_vozacka_dozvola.PocetnaActivity.access$super(mojavozacka.testovi_za_vozacka_dozvola.PocetnaActivity, java.lang.String, java.lang.Object[]) took 110.107ms
12-11 13:33:49.605 1722-1729/mojavozacka.testovi_za_vozacka_dozvola W/art: Suspending all threads took: 53.041ms
12-11 13:33:49.966 1722-1752/mojavozacka.testovi_za_vozacka_dozvola D/NetworkSecurityConfig: No Network Security Config specified, using platform default
12-11 13:33:50.168 1722-1722/mojavozacka.testovi_za_vozacka_dozvola I/SQLiteAssetHelper: successfully opened database vozacka.db
12-11 13:33:50.170 1722-1722/mojavozacka.testovi_za_vozacka_dozvola I/SQLiteAssetHelper: successfully opened database test.db
12-11 13:33:50.177 1722-1734/mojavozacka.testovi_za_vozacka_dozvola I/art: Background sticky concurrent mark sweep GC freed 10882(1917KB) AllocSpace objects, 11(220KB) LOS objects, 0% free, 45MB/45MB, paused 4.735ms total 215.229ms
12-11 13:33:50.319 1722-1778/mojavozacka.testovi_za_vozacka_dozvola I/OpenGLRenderer: Initialized EGL, version 1.4
12-11 13:33:50.319 1722-1778/mojavozacka.testovi_za_vozacka_dozvola D/OpenGLRenderer: Swap behavior 1
12-11 13:33:50.337 1722-1778/mojavozacka.testovi_za_vozacka_dozvola E/EGL_emulation: tid 1778: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
12-11 13:33:50.337 1722-1778/mojavozacka.testovi_za_vozacka_dozvola W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7d21b2f6f780, error=EGL_BAD_MATCH
12-11 13:33:50.415 1722-1734/mojavozacka.testovi_za_vozacka_dozvola I/art: Background partial concurrent mark sweep GC freed 10885(956KB) AllocSpace objects, 6(120KB) LOS objects, 8% free, 44MB/48MB, paused 19.305ms total 217.880ms
12-11 13:33:53.844 1722-1722/mojavozacka.testovi_za_vozacka_dozvola I/SQLiteAssetHelper: successfully opened database vozacka.db
12-11 13:33:53.858 1722-1722/mojavozacka.testovi_za_vozacka_dozvola I/SQLiteAssetHelper: successfully opened database test.db
12-11 13:33:53.866 1722-1734/mojavozacka.testovi_za_vozacka_dozvola W/art: Suspending all threads took: 7.410ms
12-11 13:33:53.962 1722-1778/mojavozacka.testovi_za_vozacka_dozvola E/EGL_emulation: tid 1778: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
12-11 13:33:53.962 1722-1778/mojavozacka.testovi_za_vozacka_dozvola W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7d21b2f6f040, error=EGL_BAD_MATCH
12-11 13:33:55.979 1722-1729/mojavozacka.testovi_za_vozacka_dozvola W/art: Suspending all threads took: 15.611ms
12-11 13:33:56.304 1722-1778/mojavozacka.testovi_za_vozacka_dozvola E/EGL_emulation: tid 1778: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
12-11 13:33:56.304 1722-1778/mojavozacka.testovi_za_vozacka_dozvola W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7d21b2f6f780, error=EGL_BAD_MATCH
12-11 13:33:58.573 1722-1722/mojavozacka.testovi_za_vozacka_dozvola W/IInputConnectionWrapper: finishComposingText on inactive InputConnection
12-11 13:34:00.499 1722-1729/mojavozacka.testovi_za_vozacka_dozvola W/art: Suspending all threads took: 8.897ms
12-11 13:34:01.755 1722-1734/mojavozacka.testovi_za_vozacka_dozvola I/art: WaitForGcToComplete blocked for 5.076ms for cause Background
12-11 13:34:05.741 1722-1778/mojavozacka.testovi_za_vozacka_dozvola E/EGL_emulation: tid 1778: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
12-11 13:34:05.741 1722-1778/mojavozacka.testovi_za_vozacka_dozvola W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7d21b2f6f040, error=EGL_BAD_MATCH
12-11 13:34:08.083 1722-1722/mojavozacka.testovi_za_vozacka_dozvola W/IInputConnectionWrapper: finishComposingText on inactive InputConnection

【问题讨论】:

    标签: android sqlite android-fragments android-fragmentactivity


    【解决方案1】:

    我不确定我的回答是否对你有帮助,但你可以试试,告诉我在性能方面是否相同或不同

    yourContentView= (LinearLayout) findViewById(R.id.content_main1);
    yourContentView.removeAllViews();
    

    【讨论】:

    • 你的意思是我的主要 LinearLayout 的 id 为 "layoutMain" 对吗?
    • 是的,您想用另一个问题更改其内容的布局
    • 好吧,在选择问题时更改其内容的布局是 ID 为“fragment_container”的 RelativeLayot,当我单击按钮时,我将其布局替换为另一个片段。我会尝试你的答案并告诉你它是否有效。
    • 我试过了,打开30个左右的问题后它仍然关闭。不幸的是,这不起作用
    • 很抱歉,那么您将发布 Logcat
    【解决方案2】:

    我找到了一个简单的解决方案。在打开 25 个问题时,我重新创建了相同的活动。 貌似这个bug和Activity有关,可能每个Activity最多可以替换30个Fragment。

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 2021-01-18
      • 2023-03-28
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多