我正在使用 webview 为 android 创建一个 web 浏览器。我将我的白名单(生成 xml 文件的 php 文件)保存在我的服务器中,因此我可以在需要时对其进行修改。我的应用程序会验证尝试访问的 url 是否在白名单中,如果不在,则显示对话框消息。首先,我为 android 2.3 实现了它,一切正常。现在我需要在 android 4.0 中实现它,但是当我尝试读取白名单时,它失败了。
这是我的 WebView 声明
final WebView TBrowser = (WebView) findViewById(R.id.webView);
TBrowser.getSettings().setJavaScriptEnabled(true);
TBrowser.getSettings().setLoadWithOverviewMode(true);
TBrowser.getSettings().setUseWideViewPort(true);
TBrowser.setWebViewClient(new webViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String host = Uri.parse(url).getHost();
boolean validUrl = false;
try{
URL website = new URL("http://www.mysite.com/whitelist.php);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
HandlingXML whiteListHandler = new HandlingXML(host);
xr.setContentHandler(whiteListHandler);
xr.parse(new InputSource(website.openStream()));
validUrl = whiteListHandler.isValid();
}catch (Exception e){
e.printStackTrace();
}
if (validUrl) {
// This is my web site, so do not override; let my WebView load the page
return false;
}else{
new AlertDialog.Builder(view.getContext())
.setTitle("ERROR")
.setMessage("URL not supported. Click on START OVER")
.setCancelable(true)
.create()
.show();
return true;
}
}
});
这是 xml 处理程序的代码:
public class HandlingXML extends DefaultHandler{
boolean validationResult = false;
String hostName;
public HandlingXML(String hn){
hostName = hn;
}
public boolean isValid(){
return validationResult;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equals("item") && !validationResult){
if (attributes.getValue("data").equals(hostName)){
validationResult = true;
} else {
validationResult = false;
}
}
}
}
这是生成 xml 的 php:
header("content-type: text/xml");
echo "<?xml version=\"1.0\" ?>\n";
echo "<whiteList>\n";
echo "<item data=\"www.facebook.com\"/>\n";
echo "<item data=\"m.facebook.com\"/>\n";
echo "<item data=\"api.twitter.com\"/>\n";
echo "<item data=\"plus.google.com\"/>\n";
echo "<item data=\"accounts.google.com\"/>\n";
echo "</whiteList>\n";
因此,这在 android 2.3 中运行良好,但在 4.0 中跳过了 try 部分(在读取和处理白名单时)。
我发现“......您的应用程序在 Android 3.0 及更高版本上崩溃,但在 Android 2.x 上运行良好的原因是因为 HoneyComb 和 Ice Cream Sandwich 对 UI 线程的滥用更加严格......”
http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html
现在,有人可以帮我弄清楚如何解决这个问题吗???
在有关使用 AsyncTask 的文章中提到...我曾经解决过类似的问题:
从改变:
Thread timer = new Thread() {
public void run() {
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
Intent QuickRateIntent = new Intent(
"com.terillion.TERILLIONBROWSERACTIVITY");
startActivity(QuickRateIntent);
}
}
};
timer.start();
至:
new timerAsync().execute();
和:
public class timerAsync extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
Thread timer = new Thread() {
public void run() {
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
Intent QuickRateIntent = new Intent(
"com.terillion.TERILLIONBROWSERACTIVITY");
startActivity(QuickRateIntent);
}
}
};
timer.start();
return null;
}
}
但我不知道如何让它在这里工作。我需要做什么改变???在哪里???