在片段之间切换时获得ANR

时间:2014-08-14 16:16:07

标签: android android-fragments

在我的应用程序中,我为LoginActivity使用了2个片段:LoginFragMainLoginFragWebView。输入LoginActivity后,用户会看到LoginFragMainView点击后会显示LoginFragWebView

第二个Fragment包含WebView,它目前不加载任何网址,但只会被初始化。在Activity我在Fragments之间切换,如:

    private void swapFrags(String fragmentToShowTag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    if (fragmentToShowTag.equals(TAG_FRAG_LOGIN_MAIN)) {
        ft.hide(mLoginFragWeb);
        ft.show(mLoginFragMain);
        ft.commit();
    } else {
        ft.hide(mLoginFragMain);
        ft.show(mLoginFragWeb);
        ft.commit();
    }
}

要允许用户取消授权,我已覆盖onBackPressed()

    @Override
public void onBackPressed() {
    if (mLoginFragWeb.isVisible())
        swapFrags(TAG_FRAG_LOGIN_MAIN);
    else
        super.onBackPressed();
}

问题:按下后退时,片段会正确交换。但是,当我再次按回来关闭应用程序时,它会冻结一段时间,然后我会收到ANR。 Dalvikvm仅报告它将堆栈跟踪写入data/anr/traces.txt。我检查了那些,发现了一个很长的日志,我不明白。出于大小原因,我使用了pastebin for those logs。我的测试设备是Nexus 5 @ 4.4.4

有什么想法在这里发生了什么?

2 个答案:

答案 0 :(得分:0)

似乎是一个浏览器问题:

  

" CleanupReference"守护进程prio = 5 tid = 14等待|基团="主"   sCount = 1 dsCount = 0 obj = 0x4264c778 self = 0x75ecb1b8 | sysTid = 16122   nice = 0 sched = 0/0 cgrp = apps handle = 1978447376 | state = S schedstat =(   94792 21093 2)utm = 0 stm = 0 core = 2 at java.lang.Object.wait(Native   方法)      - 等待< 0x4264c6b0> java.lang.Object.wait(Object.java:401)上的(java.lang.ref.ReferenceQueue)

     

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)

     

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)

     

在   com.android.org.chromium.content.common.CleanupReference $ 1.run(CleanupReference.java:49)

只使用没有webview的任何其他片段,看看你是否仍然看到错误。这将有助于找出问题的原因。

答案 1 :(得分:0)

哦,好吧,我想出来了,并且想要用这些问题来污染SO而道歉。我有一个不可见的闪屏,我完全忘了它finish(),所以它引起了无限循环。当你不注意时就会发生这种情况。