36

WebView を使用して、アプリのアクティビティの 1 つにインターネット コンテンツを表示します。
問題は、ユーザーがこのアクティビティから切り替えると、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(...)) で Web ページを開くための呼び出しを無効にすると、これらのスレッドは当然開始されないため、アクティビティを終了した後も残りません。

WebViewアクティビティを終了した後に のスレッドを停止する方法についてのアイデアはありますか?

4

10 に答える 10

40

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

于 2010-08-20T08:31:52.333 に答える
16

拡張された 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) {}
     }
 }
于 2011-09-26T10:45:53.610 に答える
4

この andev.org スレッド ( WebViewCoreThread 問題) を見てください。

応答を参照してください... Re: WebViewCoreThread の問題

2) フラッシュを一時停止するには、隠しメソッド WebView.onPause() / WebView.onResume() を呼び出す必要があります。

3) WebViewCoreThread を一時停止するには、WebView.pauseTimers() / WebView.resumeTimers() を使用します。

onPause/onResume をスキップしましたが、実装webView.pauseTimers()webView.resumeTimers()て、少なくとも CPU ブリードを止めました。

onPause/onResumeにもCookieSyncManager.getInstance().stopSync()/を追加しました。startSync

于 2011-03-14T19:25:44.853 に答える
2

実際、使用してwebView.destroy(), onPause(), clear**()も Webcore とその関連スレッドはまだ停止できません。

実際には、WebView が存在するアクティビティを独立したプロセスに設定し、アクティビティが終了すると Webcore を含むすべてのスレッドが破棄されるようにするのが理想的です。

それが私が採用した方法です。多分それはあなたにとっても役に立ちます。

于 2014-05-31T13:12:45.893 に答える
2

WebView.destroy() はどうですか? ファンキーなリフレクション呼び出しを行わずに、物事や私を片付けているようです。

于 2013-05-17T15:57:05.423 に答える
2

これらの情報に感謝します。電話のロックボタンを押したときにwebViewのswfでサウンドを一時停止するという問題がありました.onPauseとonResumeは、ロック解除ボタンを押してもswfを再生しますが、アクティビティはまだ表示されません. webView で swf サウンドの再生を一時停止および再開する場合は、これらを onWindowFocusChanged に配置します。

@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);
}
于 2011-10-13T08:14:03.463 に答える
0

WebView専用のメモリをクリアするには、WebViewのonDestroyを呼び出す必要がありました。フラッシュを読み込んでいて、Webビューでこのアクティビティに戻ると、アプリが強制終了していました。あなたがそれを使い終えるたびにあなたのWebViewを破壊しなければ、Flashはあなたを生き生きと食べます。

于 2011-01-21T18:33:02.883 に答える
0

上記のソリューションは、Android 2.3.3 を搭載した Samsung Galaxy S では失敗しました。しかし、以下の回避策を試して成功しました:

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

存在しない html ファイルを webview に強制的にロードさせています。これは、WebView にクリーンアップを強制しているようです。

于 2013-05-09T09:57:59.307 に答える