问题
I have tweaked my Honeycomb application to work on ICS. All is well EXCEPT my ads in the webview no longer display. I have made no code changes to this section. The ICS compatible code shows ads on a HoneyComb device but not on an ICS device. What is different and how do I handle?
Here are logs that I receive on ICS device, but not HoneyComb or lower:
03-08 14:50:42.485: W/webview(24262): java.lang.Throwable: Warning: A WebView method was called on thread 'Thread-617'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads.
03-08 14:50:42.485: W/webview(24262): at android.webkit.WebView.checkThread(WebView.java:9468)
03-08 14:50:42.485: W/webview(24262): at android.webkit.WebView.getSettings(WebView.java:4143)
03-08 14:50:42.485: W/webview(24262): at com.accuweather.android.tablet.ads.AdView$2.run(AdView.java:160)
03-08 14:50:42.495: W/System.err(24262): java.io.IOException: java.net.URISyntaxException: Invalid % sequence: %wl in query at index 138: http://www.accuweather.com/adrequest/adrequest.asmx/getAdCode?strAppID=lenovo&strPartnerCode=lenovo&strIpAddress=fe80::42fc:89ff:fe93:9fcb%wlan0&strUserAgent=Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0.3%3B+en-us%3B+Xoom+Build%2FIML77%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Safari%2F534.30&strCurrentZipCode=cityId=335315&strWeatherIcon=12&strUUID=99000052310400
03-08 14:50:42.495: W/System.err(24262): at libcore.net.http.HttpEngine.<init>(HttpEngine.java:194)
03-08 14:50:42.495: W/System.err(24262): at libcore.net.http.HttpURLConnectionImpl.newHttpEngine(HttpURLConnectionImpl.java:256)
03-08 14:50:42.495: W/System.err(24262): at libcore.net.http.HttpURLConnectionImpl.initHttpEngine(HttpURLConnectionImpl.java:243)
03-08 14:50:42.495: W/System.err(24262): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:78)
03-08 14:50:42.495: W/System.err(24262): at com.accuweather.android.tablet.ads.AdView$AdRequest.getInputStreamFromURL(AdView.java:345)
03-08 14:50:42.495: W/System.err(24262): at com.accuweather.android.tablet.ads.AdView$AdRequest.makeRequest(AdView.java:293)
03-08 14:50:42.495: W/System.err(24262): at com.accuweather.android.tablet.ads.AdView$2.run(AdView.java:159)
03-08 14:50:42.495: W/System.err(24262): Caused by: java.net.URISyntaxException: Invalid % sequence: %wl in query at index 138: http://www.accuweather.com/adrequest/adrequest.asmx/getAdCode?strAppID=lenovo&strPartnerCode=lenovo&strIpAddress=fe80::42fc:89ff:fe93:9fcb%wlan0&strUserAgent=Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0.3%3B+en-us%3B+Xoom+Build%2FIML77%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Safari%2F534.30&strCurrentZipCode=cityId=335315&strWeatherIcon=12&strUUID=99000052310400
03-08 14:50:42.495: W/System.err(24262): at libcore.net.UriCodec.validate(UriCodec.java:58)
03-08 14:50:42.495: W/System.err(24262): at java.net.URI.parseURI(URI.java:406)
03-08 14:50:42.495: W/System.err(24262): at java.net.URI.<init>(URI.java:204)
03-08 14:50:42.495: W/System.err(24262): at java.net.URL.toURILenient(URL.java:510)
03-08 14:50:42.495: W/System.err(24262): at libcore.net.http.HttpEngine.<init>(HttpEngine.java:192)
03-08 14:50:42.495: W/System.err(24262): ... 6 more
回答1:
The ICS WebView implementation was revamped, so a lot of us are having issues with pre-ICS and ICS WebView behavior.
It looks like you have two problems.
First, you want to encode your query, as it looks like you can't pass that "%" which has a special meaning in HTML escaping. It looks like it is happening in the strIpAddress parameter. You can use code like this:
String encodedIPAddress = URLEncoder.encode(strIpAddressValue);
I would encode each parameter value, then put those all together into your final URL String using String.format or just String +. This way you'll avoid any future similar problems.
Second, Android is complaining that you're not calling the WebView from a UI thread. I would wrap the method (I'm assuming you're calling it showAd()) that you are calling in runInUiThread like so:
activity.runOnUiThread(new Runnable() {
public void run() {
webView.showAd();
}
});
回答2:
in my case, I had following line inside Activity.runOnUiThread(Runnable runnable).
webView.setWebChromeClient(WebChromeClient webChromeClient);
which showed the progress meter.
When I commented out that line, the application stopped showing
the error you mentioned.
来源:https://stackoverflow.com/questions/9621257/ads-showing-on-honeycomb-webview-but-not-ics-webview