安卓Phonegap - 尝试设置WebViewClient时出现超时错误

6

我正在使用Android和Phonegap进行工作,目前我在处理一个简单的问题。我需要为PhoneGap webView设置webViewClient,以便捕获页面完成的URL并处理它。

这是代码:

public class PhoneGapTest extends DroidGap {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.setBooleanProperty("loadInWebView", true);
        super.clearCache();
        super.keepRunning = false; 
        super.loadUrl("file:///android_asset/www/index.html");

        super.appView.setWebViewClient(new WebViewClient(){

          @Override
          public void onPageStarted(WebView view, String url, Bitmap bitmap) {

            Log.i("TEST", "onPageStarted: " + url);

          }

          @Override
          public void onPageFinished(WebView view, String url) {

            Log.i("TEST", "onPageFinished: " + url);

          }

        });

    }

这段代码似乎不起作用,页面加载不出来,我收到了一个TIMEOUT ERROR的错误提示。但是如果我删除“setWebViewClient”部分,页面就可以完美地加载。

我发现有一个名为CordovaWebViewClient的类,我是否必须使用它而不是WebViewClient?我在网上找到了以下方法:

        this.appView.setWebViewClient(new CordovaWebViewClient(this){

          @Override
          public boolean shouldOverrideUrlLoading(final WebView view, String url) { 
            Log.i("BugTest", "shouldOverrideUrlLoading: " + url); 
            return true; 
          }

          @Override
          public void onPageStarted(WebView view, String url, Bitmap bitmap) {

            Log.i("TEST", "onPageStarted: " + url);

          }

          @Override
          public void onPageFinished(WebView view, String url) {

            Log.i("TEST", "onPageFinished: " + url);

          }

          @Override
          public void doUpdateVisitedHistory(WebView view, String url, boolean isReload){        
          }

        });

但是那段代码还是不起作用,我仍然收到了一个超时错误。我看到已经有一个webVieClient成员了,但我不知道是否必须使用它以及如何使用。
我正在使用Phonegap版本1.9.0。
谢谢阅读。
答复Simon:
这样做可以,谢谢!
public class MainActivity extends DroidGap {

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    super.init();
    super.appView.clearCache(true);
    super.appView.clearHistory();
    this.appView.setWebViewClient(new CustomCordovaWebViewClient(this));
    super.loadUrl("file:///android_asset/www/index.html");
}

public class CustomCordovaWebViewClient extends CordovaWebViewClient {

 public CustomCordovaWebViewClient(DroidGap ctx) {
   super(ctx);
 }

 @Override
 public void onPageStarted(WebView view, String url, Bitmap bitmap) {
   super.onPageStarted(view, url, bitmap);
   Log.i("TEST", "onPageStarted: " + url);
 }

 @Override
 public void onPageFinished(WebView view, String url) {
   super.onPageFinished(view, url);
   Log.i("TEST", "onPageFinished: " + url);
 }

 @Override
 public void doUpdateVisitedHistory(WebView view, String url, boolean isReload){  
     super.doUpdateVisitedHistory(view, url, isReload);  
 }

 @Override
 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
     super.onReceivedError(view, errorCode, description, failingUrl);
 }

}

}
3个回答

7

我认为我已经在最新的Cordova版本中解决了这个问题(我使用的是2.2)。它在onPageStarted()失败,因为它期望一个null的appView。设置appView似乎可以修复它,例如:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.init();

    CordovaWebViewClient webViewClient = new CustomAcceptingWebViewClient(this);
    webViewClient.setWebView(this.appView);
    this.appView.setWebViewClient(webViewClient);

    super.loadUrl("file:///android_asset/www/index.html");

}

请注意,super.init()也是必需的。

5
为了实现你想要的功能,我建议扩展CordovaWebViewClient类并覆盖你需要的方法,但不要忘记调用super方法,否则PhoneGap将无法正常工作,因为它是一个重要的类。

谢谢你的回答,Simon。我试过了,但是不起作用。我已经更新了第一篇帖子,加入了你所说的代码。这就是你说的吗? - Spike777
最终在onPageFinished方法中调用了"super.onPageFinished(view, url);",终于成功了...谢谢! - Spike777
哦,我刚刚想到这只在1.8.1版本中可行,在1.9.0版本中不行: 在调用super.onPageStarted(...)时会抛出一个错误。 - Spike777
请问您可以建议或提供一个链接,介绍如何覆盖CordovaWebViewClient吗?我遇到了像“Webview cannot be resolved to a type”这样的错误。 - arod

0

你忘记调用super了 ;)

    // Assign webclient.
    this.appView.setWebViewClient(new CordovaWebViewClient(me, this.appView) {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接