2015-06-14 15 views
8

Napisałem aplikację, która wyświetla strony html w Webviews, które są zarządzane w ViewPager. Wszystko działa poprawnie, ale miałem kilka błędów ANR podczas przesuwania z jednej strony na drugą. Zrzut danych ANR pokazuje, że główny wątek wywołał przez ThreadedRenderer.nSyncAndDrawFrame(), która wywołuje natywną metodę, która najwyraźniej komunikuje się z wątkiem Renderer i czeka, aż wątek zakończy rysowanie widoku. Ponieważ oba z nich wykonują natywny kod, trudno jest ustalić, co się dzieje, ale wygląda na to, że wątek Renderer nigdy nie zasygnalizował głównego wątku do wznowienia, powodując ANR. W raporcie ANC nie ma nic przed raportem ANR, który sugeruje każdy problem.Webview powoduje ANR

Czy ktoś ma sugestie, jak rozwiązać ten problem? Zakładam, że wywołanie ThreadedRenderer.nSyncAndDrawFrame() jest powiązane z widokiem sieciowym, ale tak naprawdę nie mam niczego, aby to potwierdzić.

Problem nie jest powtarzalny w tym sensie, że jeśli ponownie uruchomię aplikację i przejdę na tę samą stronę, która była wyświetlana po wystąpieniu błędu ANR, nie nastąpi to ponownie. Urządzenie to Nexus 7 z systemem Android 5.1.

ANR StackTrace dla głównych i renderer wątków:

"main" prio=5 tid=1 Native 
| group="main" sCount=1 dsCount=0 obj=0x73547000 self=0xb4827800 
| sysTid=1248 nice=-6 cgrp=default sched=0/0 handle=0xb6fd6bec 
| state=S schedstat=(0 0 0) utm=6035 stm=1406 core=0 HZ=100 
| stack=0xbe5a6000-0xbe5a8000 stackSize=8MB 
| held mutexes= 
kernel: (couldn't read /proc/self/task/1248/stack) 
native: #00 pc 000133b8 /system/lib/libc.so (syscall+28) 
native: #01 pc 00016a81 /system/lib/libc.so (__pthread_cond_timedwait_relative(pthread_cond_t*, pthread_mutex_t*, timespec const*)+56) 
native: #02 pc 0003c73b /system/lib/libhwui.so (???) 
native: #03 pc 0003c771 /system/lib/libhwui.so (???) 
native: #04 pc 0083fd83 /data/dalvik-cache/arm/[email protected]@boot.oat (Java_android_view_ThreadedRenderer_nSyncAndDrawFrame__JJJF+134) 
at android.view.ThreadedRenderer.nSyncAndDrawFrame(Native method) 
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:340) 
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2530) 
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2352) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1982) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
at android.view.Choreographer.doFrame(Choreographer.java:550) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5254) 
at java.lang.reflect.Method.invoke!(Native method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

"RenderThread" prio=5 tid=26 Native 
| group="main" sCount=1 dsCount=0 obj=0x12c07820 self=0xa1c30800 
| sysTid=1303 nice=-4 cgrp=default sched=0/0 handle=0xa1c44c00 
| state=S schedstat=(0 0 0) utm=8314 stm=1817 core=0 HZ=100 
| stack=0xa0cc2000-0xa0cc4000 stackSize=1012KB 
| held mutexes= 
kernel: (couldn't read /proc/self/task/1303/stack) 
native: #00 pc 000133b8 /system/lib/libc.so (syscall+28) 
native: #01 pc 0001741b /system/lib/libc.so (__futex_wait_ex+42) 
native: #02 pc 00017761 /system/lib/libc.so (pthread_mutex_lock+230) 
native: #03 pc 0001d767 /system/vendor/lib/libgsl.so (os_mutex_lock+6) 
native: #04 pc 0001ea88 /system/vendor/lib/egl/libEGL_adreno.so (egliDoDestroyEGLImage+180) 
native: #05 pc 0008698d /system/vendor/lib/egl/libGLESv2_adreno.so (rb_image_try_release+32) 
native: #06 pc 00086acf /system/vendor/lib/egl/libGLESv2_adreno.so (rb_destroy_resource_updates_pure+136) 
native: #07 pc 00085491 /system/vendor/lib/egl/libGLESv2_adreno.so (rb_perform_resolve+276) 
native: #08 pc 00085761 /system/vendor/lib/egl/libGLESv2_adreno.so (rb_resolve+464) 
native: #09 pc 0008a891 /system/vendor/lib/egl/libGLESv2_adreno.so (rb_surface_swap+228) 
native: #10 pc 0006af89 /system/vendor/lib/egl/libGLESv2_adreno.so (gl2_surface_swap+76) 
native: #11 pc 0005d12b /system/vendor/lib/egl/libGLESv2_adreno.so (oglSwapBuffer+194) 
native: #12 pc 00013ddc /system/vendor/lib/egl/libEGL_adreno.so (qeglDrvAPI_eglSwapBuffers+1776) 
native: #13 pc 00007b60 /system/vendor/lib/egl/libEGL_adreno.so (eglSwapBuffers+16) 
native: #14 pc 00f /system/lib/libEGL.so (eglSwapBuffers+290) 
native: #15 pc 0003d291 /system/lib/libhwui.so (???) 
native: #16 pc 0003bd05 /system/lib/libhwui.so (???) 
native: #17 pc 0003beb5 /system/lib/libhwui.so (???) 
native: #18 pc 0003caed /system/lib/libhwui.so (???) 
native: #19 pc 0003e743 /system/lib/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+66) 
native: #20 pc 000104d5 /system/lib/libutils.so (android::Thread::_threadLoop(void*)+112) 
native: #21 pc 0005f839 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+72) 
native: #22 pc 00010045 /system/lib/libutils.so (???) 
native: #23 pc 00016baf /system/lib/libc.so (__pthread_start(void*)+30) 
native: #24 pc 00014af3 /system/lib/libc.so (__start_thread+6) 
+0

Czy znalazłeś rozwiązanie? Mam ten sam problem i mogę go odtworzyć tylko na Nexusie 7, gdy w ViewPager – Tughi

+0

@ Tughi No solution jest jeszcze wiele dużych elementów, ale zauważam, że dzieje się to tylko po wywołaniu stosunkowo dużej liczby Fragmentów w ViewPager. Właśnie wprowadziłem pewne zmiany w mojej implementacji FragmentStatePagerAdapter i zobaczę, czy to robi jakąkolwiek różnicę. – Clyde

+0

@Clyde Czy możesz wyjaśnić, jakie są twoje zmiany i czy są pomocne? Miałem ten sam problem na moich urządzeniach. Rozwiązanie umożliwiające odinstalowanie aktualizacji WebView może być tylko tymczasowym rozwiązaniem. – mars3142

Odpowiedz

1

mam do czynienia z tym problemem zbyt Wydaje się, że Chromium bug, który związany jest z najnowszym Chromium Webview 43.0.23567.121. Możesz spróbować przywrócić przeglądarkę internetową w swojej aplikacji i sprawdzić ją ponownie. Dla mnie wydanie odtwarzalne tylko w najnowszej wersji Webview.

+1

Wygląda na to: https://code.google.com/p/chromium/issues/detail?id=501901 –

0

Może to być błąd w Android 7.0 WebView, można go naprawić na dwa sposoby poniżej:

1 webView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

2, android: hardwareAccelerated = "false"

Powiązane problemy