2017-09-03 15 views
-2

这是一个函数来获取长的URL从短网址,例如goo.gl,bit.ly ...Android的 - 如何扩大缩短的URL使用的WebView

private String expandUrl(String shortUrl) { 
    String finalURL = ""; 
    webView.loadUrl(shortUrl); 
    webView.setWebViewClient(new WebViewClient() { 
     public void onPageFinished(WebView view, String url) { 
      finalURL = webView.getUrl(); 
     } 
    }); 
    return finalURL; 
} 

我想存储webView.getUrl()为String调用finalURL,这样我可以在以后使用它,但它得到错误

error: local variable finalURL is accessed from within inner class; needs to be declared final

什么是我的错?

+0

我编辑的职位刚才,请看一看,谢谢。 – StackSN

回答

0

如果finalURL变量是外部类的成员变量,则有可能为您节省了webView.getUrl()来finalURL供以后目的,如解析,但如果finalURL是一个局部变量,那么它是不可能的,除非你把它作为一个数组对象和最终变量。 使用下面的代码。而不是使用普通的finalURL,使用finalURL [0]以后存储和解析。

final String[] finalURL = {""}; 
String url1 = "goo.gl/RvoAZH"; 
webView.loadUrl(url1); 
webView.setWebViewClient(new WebViewClient() { 
public void onPageFinished(WebView view, String url) { 
System.out.println(webView.getUrl()); // whatever way to debug 
finalURL[0] = webView.getUrl(); 
} 
}); 

在这里,在下面的示例中,你可以看到局部变量localVar的的值由该方法(anonyMethod)匿名对象内部改变从“”发送给

public class Check { 
    public void method() { 
     final String[] localVar = {""}; 
     new Object() { 
      public void anonyMethod() { 
       System.out.println(localVar[0]); // sure 
       localVar[0] = "a"; // nope 
      } 
     }.anonyMethod(); 
     System.out.println(localVar[0]); 
    } 

    public static void main(String[] args) 
    { 
     Check ck = new Check(); 
     ck.method(); 
    } 
} 

编辑1 你能还发布一些更多的代码。

编辑2 添加我自己的示例代码。

+0

任何建议如何使它能够通过差异类之间? – StackSN

+0

我已经更新了上面的答案。让我知道,如果上述代码的作品。 – Sam

+0

没有错误,但变量'finalURL [0]'没有值。 – StackSN

0

如果您需要更改此字段,然后将其设置为类级别变量,那么您正在使用匿名类中的已定义字段。在你所有的方法之外声明它。 试试这个

public String finalURL = ""; 
+0

我也得到错误,'错误:不能赋值给最终变量finalURL' – StackSN

0

你可以试试这个

private class MyWebViewClient extends WebViewClient { 
     @SuppressWarnings("deprecation") 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      final Uri uri = Uri.parse(Uri.decode(url)); 
      return handleUri(uri); 
     } 

     @TargetApi(Build.VERSION_CODES.N) 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
      final Uri uri = request.getUrl(); 
      return handleUri(uri); 
     } 

     private boolean handleUri(final Uri uri) { 
      return false; 
     } 

     @Override 
     public void onLoadResource(WebView view, String url) { 
      if (url.equals("http://yoururl.com")) { 
       // do something 
      } 
     } 

     @Override 
     public void onFormResubmission(WebView view, Message dontResend, Message resend) { 
      resend.sendToTarget(); 
     } 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      mCacheWebView.setVisibility(View.INVISIBLE); 
      showSwipeRefresh(); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      if (webViewError) { 
       setErrorWebView(); 
      } else { 
       if (mCacheWebView != null) { 
        mCacheWebView.loadUrl("javascript:(function() { " + 
          "var head = document.getElementsByTagName('header')[0];" 
          + "head.parentNode.removeChild(head);" + 
          "})()"); 
        mCacheWebView.setVisibility(View.VISIBLE); 
       } 
      } 
      hideSwipeRefresh(); 
     } 

     @Override 
     public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { 
      super.onReceivedHttpError(view, request, errorResponse); 
     } 

     @Override 
     public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
      String message = "SSL Certificate error."; 
      switch (error.getPrimaryError()) { 
       case SslError.SSL_UNTRUSTED: 
        message = "The certificate authority is not trusted."; 
        break; 
       case SslError.SSL_EXPIRED: 
        message = "The certificate has expired."; 
        break; 
       case SslError.SSL_IDMISMATCH: 
        message = "The certificate Hostname mismatch."; 
        break; 
       case SslError.SSL_NOTYETVALID: 
        message = "The certificate is not yet valid."; 
        break; 
      } 
      message += " Do you want to continue anyway?"; 
      Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); 
     } 

     @RequiresApi(api = Build.VERSION_CODES.M) 
     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
      onReceivedError(view, error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); 
//   view.loadUrl("file:///android_asset/no_internet.html"); 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      webViewError = true; 

     } 
    }