我正在使用webview为Android创建一个Web浏览器。我在我的服务器中保留了我的白名单(生成xml文件的php文件),所以我可以随时修改它。我的应用验证尝试访问的网址是否在白名单中,如果没有,则显示对话框消息。首先,我为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;
}
}
但我不知道如何让它在这里工作。我需要做出哪些改变?和哪里???