离开活动后,WebView似乎没有被销毁?

时间:2011-06-27 22:47:09

标签: android

我有一个带有webview的活动。看起来webview不会随着活动而被破坏。为了演示,我创建了一个html页面,它运行一个计时器,每隔几秒钟加载一次图像资源。在销毁活动后脚本继续执行:

public class MyWebViewActivity extends Activity {
  private WebView mWebView;

  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.the_layout);

    mWebView = (WebView)findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setBuiltInZoomControls(true);
    mWebView.setWebViewClient(new EmbeddedWebViewClient());
    mWebView.loadUrl("test url");
  }

  private class EmbeddedWebViewClient extends WebViewClient {
    @Override
    public void onLoadResource(WebView view, String url) {
        super.onLoadResource(view, url);

        if (Config.DEBUG) { Log.v(TAG, "onLoadResource(): " + url); }
    }
  }
}

因此,只要调用onLoadResource(),上面只会打印一条日志语句。这是测试html页面中的javascript:

<html>
  <head>
    <script type="text/javascript">

      function load() {
        setInterval("doit()", 3000);
      }

      function doit() {
        Image1 = new Image(150, 20);
        Image1.src = "abc_" + Math.floor(Math.random()*100) + ".png";
      }

    </script>
  </head>

  <body onload="load()">
  </body>
</html>

以上只是在定时器间隔创建一个图像资源,以触发EmbeddedWebViewClient()中的onLoadResource()方法。

所以是的,我可以在LogCat中看到消息在离开活动后继续打印。我们必须以某种方式关闭WebView吗?也许这就是这里描述的问题:

http://code.google.com/p/android/issues/detail?id=9375

如果已知问题应该在api文档中记录吗?

注意:在Android 2.3.4,Nexus S上运行它。

由于

5 个答案:

答案 0 :(得分:1)

如果活动无法恢复,您也可以调用mWebView.stopLoading()。

答案 1 :(得分:1)

此解决方案对我有用:

在MyActivity.java文件中,我添加了:

@Override
protected void onDestroy() {
    webview.destroy();
    webview = null;
    super.onDestroy();
}

答案 2 :(得分:0)

我不熟悉WebView,但您确定您的活动真的被破坏了吗? 尝试拨打

this.finish()

当你想让它退出时。 如果仍然无效,那么您希望控制活动即将死亡时会发生什么:

@Override
protected void onDestroy()
{
//    make a call to your script, tell it to end
}

当然,如果您希望脚本停止而不会完全破坏您的活动,您可以覆盖onPause()或onStop()

希望这有帮助

答案 3 :(得分:0)

您可能正在寻找pauseTimers()和resumeTimers()调用。如果你将它添加到你的活动中,我认为它会开始做你期望的事情:

public void onResume() {
  super.onResume();
  if (mWebView != null) {
      mWebView.resumeTimers();
  }
}

public void onPause() {
  super.onPause();
  if (mWebView != null) {
      mWebView.pauseTimers();
  }
}

当您从应用程序交换时,logcat消息会停止,并在您返回时开始备份。

答案 4 :(得分:0)

似乎没有。

android develop doc here

  

当设备方向或任何其他配置更改时,将销毁并重新创建活动的标准行为。这将导致WebView重新加载当前页面。

因此,我认为在您离开活动时无需销毁webview。只是听一些事件。