WebView线程永远不会停止(WebViewCoreThread,CookieSyncManager,http )

我使用WebView在应用程序的某个活动中显示一些互联网内容。
问题是,当用户切换出这个活动,WebView的线程继续运行!
有问题的线程是:

Thread [<17> WebViewCoreThread] (Running) Thread [<25> CookieSyncManager] (Running) Thread [<19> http0] (Running) Thread [<29> http1] (Running) Thread [<31> http2] (Running) Thread [<33> http3] (Running) 

暂停这些线程中的每一个,并检查它正在忙什么:

 Thread [<17> WebViewCoreThread] (Suspended) Object.wait(long, int) line: not available [native method] MessageQueue(Object).wait() line: 288 MessageQueue.next() line: 148 Looper.loop() line: 110 WebViewCore$WebCoreThread.run() line: 471 Thread.run() line: 1060 Thread [<25> CookieSyncManager] (Suspended) Object.wait(long, int) line: not available [native method] MessageQueue(Object).wait(long) line: 326 MessageQueue.next() line: 144 Looper.loop() line: 110 CookieSyncManager(WebSyncManager).run() line: 90 Thread.run() line: 1060 Thread [<19> http0] (Suspended) Object.wait(long, int) line: not available [native method] RequestQueue(Object).wait() line: 288 ConnectionThread.run() line: 93 

我不知道如何告诉每个线程的Looper退出。

我试图在activity的onPause()方法中调用webView.destroy() ,但是没有任何影响。
当我禁用在webView( webView.loadUrl(...) )中打开网页的webView.loadUrl(...) ,这些线程自然不会启动,因此不会在离开活动后继续。

关于如何让WebView的线程在离开活动后停止的任何想法?

您应该能够通过在web视图上调用onPause / onResume来停止/恢复这些线程。

这些都是隐藏的,所以你需要通过反思去做。 下面的代码为我工作:

 Class.forName("android.webkit.WebView").getMethod("onPause", (Class[]) null).invoke(webView, (Object[]) null); 

webView是WebView的实例。

另请参阅: http : //code.google.com/p/android/issues/detail?id=10282

我的解决scheme,在扩展的webview类(在android 2.2,andriod 2.3,android 3.1testing):

 private boolean is_gone=false; public void onWindowVisibilityChanged(int visibility) {super.onWindowVisibilityChanged(visibility); if (visibility==View.GONE) {try {WebView.class.getMethod("onPause").invoke(this);//stop flash } catch (Exception e) {} this.pauseTimers(); this.is_gone=true; } else if (visibility==View.VISIBLE) {try {WebView.class.getMethod("onResume").invoke(this);//resume flash } catch (Exception e) {} this.resumeTimers(); this.is_gone=false; } } public void onDetachedFromWindow() {//this will be trigger when back key pressed, not when home key pressed if (this.is_gone) {try {this.destroy(); } catch (Exception e) {} } } 

干净简单的解决scheme,完成这项工作:

 @Override public void onPause() { super.onPause(); webView.onPause(); webView.pauseTimers(); //careful with this! Pauses all layout, parsing, and JavaScript timers for all WebViews. } @Override public void onResume() { super.onResume(); webView.onResume(); webView.resumeTimers(); } @Override public void onDestroy() { super.onDestroy(); parentViewGroup.removeAllViews(); //the viewgroup the webview is attached to webView.loadUrl("about:blank"); webView.stopLoading(); webView.setWebChromeClient(null); webView.setWebViewClient(null); webView.destroy(); webView = null; } 

看看这个andev.org线程( WebViewCoreThread问题 )。

看到响应… Re:WebViewCoreThread问题 – Postby马铃薯

2)要暂停闪光你必须调用隐藏的方法WebView.onPause()/ WebView.onResume()。

3)要暂停WebViewCoreThread,请使用WebView.pauseTimers()/ WebView.resumeTimers()。

我跳过了onPause / onResume,但我实现了webView.pauseTimers()webView.resumeTimers() ,它至less停止CPU出血。

我还将CookieSyncManager.getInstance().stopSync() / startSync到我的onPause / onResume中。

感谢您的这些信息,我有这个问题暂停声音在我的SWF在WebView时,当我按手机上的lockingbutton,onPause和onResume仍然播放我的瑞士法郎,当我按下解锁button,但活动仍然不可见,我build议你把这些放在onWindowFocusChanged上,如果你想暂停并继续在webView中播放swf声音

 @Override public void onWindowFocusChanged(boolean hasFocus) { gameView = (WebView) findViewById(R.id.gameView); // TODO Auto-generated method stub if (hasFocus) { try { Class.forName("android.webkit.WebView") .getMethod("onResume", (Class[]) null) .invoke(gameView, (Object[]) null); } catch (Exception e) { } gameView.resumeTimers(); gameView.loadUrl("javascript:setflashfocus()"); } else { try { Class.forName("android.webkit.WebView") .getMethod("onPause", (Class[]) null) .invoke(gameView, (Object[]) null); } catch (Exception e) { } gameView.pauseTimers(); } super.onWindowFocusChanged(hasFocus); } 

怎么样WebView.destroy()? 这似乎是清理东西或我没有做任何时髦的reflection电话。

我不得不调用WebView的Destroy清除专门为webview的内存。 我正在加载闪光灯,当我们回到这个活动的web视图时,它正在杀死我的应用程序。 如果你没有摧毁你的WebView,Flash就会把你活着吃掉。

上述解决scheme在Android 2.3.3的三星Galaxy S上失败了。 但是我尝试了下面的解决方法,取得了成功:

  webview.loadUrl("file:///android_asset/nonexistent.html"); 

我迫使webview加载一个不存在的HTML文件。 这似乎是迫使webview来清理。

实际上,使用webView.destroy(), onPause(), clear**()不能停止Webcore及其相关的线程。

实际上,一个理想的方法是将WebView所在的活动设置为一个独立的进程,这样当活动完成时,包括Webcore在内的所有线程都将被销毁。

这就是我所雇用的方式。 也许这对你也是有用的。

定义一个方法:

  private void hiddenWebViewMethod(String state){ if( webView != null ){ try { Method method = WebView.class.getMethod(state); method.invoke(webView); } catch (Exception e) { Log.e("TAG", "Exception: " + e.toString()); webView.loadData("", "text/html", "utf-8"); } } } 

然后调用hiddenWebViewMethod("onPause"); 停止加载,并hiddenWebViewMethod("onResume"); 恢复。