单击链接时,Android WebView 崩溃

Posted

技术标签:

【中文标题】单击链接时,Android WebView 崩溃【英文标题】:Android WebView crashes when clicking on a link 【发布时间】:2010-12-06 06:06:39 【问题描述】:

我的Activity 中有一些WebView 小部件。我使用loadData() 设置内容,这个html 包含一个链接。我的一些WebViews 工作正常,当我单击链接时,Web 浏览器会在新窗口中启动,但是当我单击链接时,有些会导致我的应用程序崩溃。

10-13 08:45:24.257: ERROR/androidRuntime(751): Uncaught handler: thread main exiting due to uncaught exception
10-13 08:45:24.308: ERROR/AndroidRuntime(751): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at android.app.ApplicationContext.startActivity(ApplicationContext.java:627)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at android.content.ContextWrapper.startActivity(ContextWrapper.java:236)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:185)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:277)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at android.os.Looper.loop(Looper.java:123)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at android.app.ActivityThread.main(ActivityThread.java:3948)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at java.lang.reflect.Method.invokeNative(Native Method)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at java.lang.reflect.Method.invoke(Method.java:521)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
10-13 08:45:24.308: ERROR/AndroidRuntime(751):     at dalvik.system.NativeStart.main(Native Method)

当我单击 URL 时,WebView 触发的 Intent 似乎存在问题,但我认为我无法控制此 Intent

有人知道吗?

我用这个AsyncTask来设置WebView里面的内容,效果很好:

public class SetAdTask extends AsyncTask<Void, Void, String>

    private Main main;
    private WebView webView;

    public SetAdTask(Main main, WebView webView)
        this.main = main;
        this.webView = webView;
    

    protected void onPreExecute() 
        Main.Log("onPreExecute()");                
    

    protected String doInBackground(Void... params) 
        Main.Log("doInBackground()");                
        return main.getRestClient().getAdCode();
    

    protected void onPostExecute(String result) 
        Main.Log("onPostExecute()");

        String html = "<html><head><title>ad</title></head><body>";
        html += "<div style=\"color:grey;font-size:12px;\">ADVERTISEMENT<br/>";
        html += result;
        html += "</body></html>";
        webView.loadData(html, "text/html", "latin-1");
    


【问题讨论】:

哦,我发现了问题.. 我用错误的上下文启动了 webView... 我使用了 viewView = new WebView(main.getApplicationContext()) ... 看起来 webview 渲染正常,在这种情况下,但无法正确处理意图...... T 你可以回答你自己的问题,你知道的。 【参考方案1】:

问题是我的webview 使用错误的上下文初始化...

我用过:

WebView w = new WebView(this.getApplicationContext())

哪个崩溃了...

正确的contextactivity 本身

WebView w = new WebView(this)

【讨论】:

做到了,非常感谢!虽然这个问题只出现在某些设备上。哦,好吧,现在它适用于所有人。 我遇到了同样的问题,但ListView 项目中的可点击链接。这解决了它;谢谢!【参考方案2】:

如果您不想将活动用作您的上下文,则此问题的另一个(令人惊讶的)解决方案是为WebView 设置一个空的WebViewClient

webView.setWebViewClient(new WebViewClient());

这似乎是一个 Android 错误:根据 API,您可以使用上下文对象来初始化 webview(但这可能会导致您提到的错误)。

【讨论】:

如果我能再给你投票 100 次,我会的!具有应用程序上下文的 WebView 是跨方向更改维护 WebView 内部状态的关键能力。很棒的发现。 太棒了!哈利路亚!

以上是关于单击链接时,Android WebView 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在android webview应用程序的页面上单击链接时如何防止显示加载微调器?

Android程序中嵌入WebView,单击其中的链接时无反应,请问是啥原因引起的?如何解决?

在 webview 中单击链接时如何启动活动?

当我在 WEBVIEW 应用程序中单击网站服务器中的链接时,PDF 未加载

android应用程序在webview url更改时崩溃

尝试退出插件 webview 时,带有集成插件的 Cordova 应用程序在 webview 上崩溃(android 测试)