9

问题:我想在 Android WebView 中预加载一个网页,并在 Activity 准备好时将其附加到 Activity。加载网页的触发点是在实际 Activity 被创建之前。所以我通过以下方式在服务中创建了一个 webview 对象。

MutableContextWrapper contextWrapper = new MutableContextWrapper(serviceContext.getApplicationContext());
this.webView = new WebView(contextWrapper);

当创建需要显示此 webview 的 Activity 时,我只需创建一个框架布局并添加一个子视图,即此 webview 并调用 setContentView。这样,我的 webview 就会显示预加载的网页。我也做以下

contextWrapper.setBaseContext(CurrentActivity.this);

这与上面指定的 ContextWrapper 对象相同。即使在此之后,webview 也不会绘制它能够在正常用例中绘制的 Javascript 警报。

即使当我这样做

ContextWrapper contextWrapper = new ContextWrapper(CurrentActivity.this);
this.webView = new WebView(contextWrapper);
this.webView.loadUrl(someUrl); 

WebView 无法弹出 JS 警报。我什至没有在日志中看到任何异常或致命标签。WebView 无法在其上绘制任何窗口。

这可以正常工作,这意味着直接使用当前活动的上下文创建 webView。

this.webView = new WebView(CurrentActivity.this);
this.webView.loadUrl(someUrl);

据我所知, http: //developer.android.com/reference/android/content/ContextWrapper.html只是在它持有的基本上下文上执行与在构造函数中传递给它的操作相同的操作。

我的用例是这样的。我创建了一个带有http://developer.android.com/reference/android/content/MutableContextWrapper.html传递给它的 webView 对象。MutableContextWrapper 保存一些活动的上下文,或者它可以保存或应用程序上下文。当需要显示 webview 的实际活动开始时,我在 MutableContextWrapper 中切换上下文并通过将 webview 放入框架布局和 setContentView 来显示 webview。基本上,开始加载页面的触发器是在创建 Activity 之前,因此我想在 webview 中预加载页面,并在创建时将其附加到 Activity。

4

1 回答 1

1

看起来您正在从主 UI 线程创建 Web 视图(基于使用serviceContext

这通常不是一个好主意,因为 Web 视图会期望其内部 Handler 绑定到主 UI 线程。

还有其他与此相关的线程:

无法创建线程中的 WebView

在加载活动后(即在onCreate方法中)加载 webview 并简单地向用户显示“加载”指示器会更好。在加载页面之前,您可以隐藏 webview(使用setVisibility),并使用WebViewClient侦听加载事件。

页面加载后,将 webview 上的可见性设置为VISIBLE

于 2013-03-11T21:40:12.800 回答