在我的应用程序中,我为LoginActivity
使用了2个片段:LoginFragMain
和LoginFragWebView
。输入LoginActivity
后,用户会看到LoginFragMain
,View
点击后会显示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
有什么想法在这里发生了什么?
答案 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)
finish()
,所以它引起了无限循环。当你不注意时就会发生这种情况。