Темы 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 в каждом из этих потоков, чтобы уйти.

Я попытался вызвать webView.destroy() в onPause() , но это не повлияло.
Когда я отключу вызов для открытия веб-страницы в webView ( webView.loadUrl(...) ), эти потоки естественно не запускаются и, следовательно, не остаются webView.loadUrl(...) после выхода из этой активности.

Любые идеи относительно того, как я могу сделать WebView после прекращения их деятельности?

Solutions Collecting From Web of "Темы WebView никогда не останавливаются (WebViewCoreThread, CookieSyncManager, http )"

Вы должны иметь возможность останавливать / возобновлять эти потоки, вызывая 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

Мое решение в расширенном классе webview (протестировано в android 2.2, andriod 2.3, android 3.1):

 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) {} } } 

Чистое простое решение, которое делает работу:

 @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 potatoho

2) Чтобы приостановить флэш-память, вы должны вызвать скрытые методы WebView.onPause () / WebView.onResume ().

3) Чтобы приостановить WebViewCoreThread, вы используете WebView.pauseTimers () / WebView.resumeTimers ().

Я пропустил onPause / onResume, но я реализовал webView.pauseTimers() и webView.resumeTimers() и он по крайней мере останавливает кровотечение процессора.

Я также добавил CookieSyncManager.getInstance().stopSync() / startSync в мой onPause / onResume.

Спасибо за эту информацию, у меня была эта проблема, приостанавливающая звуки в моем swf на webView, когда я нажимаю кнопку блокировки на телефоне, onPause и onResume все еще играет мой swf, когда я нажимаю кнопку разблокировки, но активность все еще не видна, я предлагаю вам Поместите их onWindowFocusChanged, если вы хотите приостановить и возобновить воспроизведение звуков swf в webView

 @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 ()? Кажется, это чистка вещей или меня, без каких-либо причудливых звонков.

Мне пришлось вызвать onDestroy из WebView, чтобы очистить память специально для веб-просмотра. Я загружал флеш-память, и это убивало мое приложение, когда мы возвращаемся к этой деятельности с помощью веб-просмотра. Flash съест вас живым, если вы не уничтожаете свой WebView КАЖДЫЙ ВРЕМЯ, с которым вы закончили.

Вышеупомянутые решения не удались для меня на Samsung Galaxy S с Android 2.3.3. Но я сделал успешную попытку обходного решения:

  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"); возобновить.