1

我正在使用 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;
    }

}

但我不知道如何让它在这里工作。我需要做什么改变???在哪里???

4

0 回答 0