0

我在 Async 任务中运行一个函数以从我的服务器上的 url 获取提要,它可以工作,但是当没有 Internet 连接时,它会通过给出错误消息来停止我的应用程序。

我不知道如何处理这个,反正这里是我的代码

获取提要的功能

   public void getContent(){
    // Initializing instance variables
    headlines = new ArrayList<String>();
    links = new ArrayList<String>();
    server_images = new ArrayList<String>();

    try {
        URL url = new URL("http://www.uglobal.org/androidServer/courses_list.xml");

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(false);
        XmlPullParser xpp = factory.newPullParser();

            // We will get the XML from an input stream
        xpp.setInput(getInputStream(url), "UTF_8");

            /* We will parse the XML content looking for the "<title>" tag which appears inside the "<item>" tag.
             * However, we should take in consideration that the rss feed name also is enclosed in a "<title>" tag.
             * As we know, every feed begins with these lines: "<channel><title>Feed_Name</title>...."
             * so we should skip the "<title>" tag which is a child of "<channel>" tag,
             * and take in consideration only "<title>" tag which is a child of "<item>"
             *
             * In order to achieve this, we will make use of a boolean variable.
             */
        boolean insideItem = false;

            // Returns the type of current event: START_TAG, END_TAG, etc..
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG) {

                if (xpp.getName().equalsIgnoreCase("item")) {
                    insideItem = true;
                } else if (xpp.getName().equalsIgnoreCase("title")) {
                    if (insideItem)
                        headlines.add(xpp.nextText()); //extract the headline
                } else if (xpp.getName().equalsIgnoreCase("link")) {
                    if (insideItem)
                        links.add(xpp.nextText()); //extract the link of article
                } else if (xpp.getName().equalsIgnoreCase("image")) {
                    if (insideItem)
                        server_images.add(xpp.nextText()); //extract the link of article
                }
            }else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){
                insideItem=false;
            }

            eventType = xpp.next(); //move to next element
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public InputStream getInputStream(URL url) {
   try {
       return url.openConnection().getInputStream();
   } catch (IOException e) {
       return null;
     }
}

比我在异步任务中运行这个函数

异步任务

    private class PostTask extends AsyncTask<String, Integer, String>{
    @Override

    protected void onPreExecute() {
        // TODO Auto-generated method stub
        progressDialog = ProgressDialog.show(ListViewImagesActivity.this, "Loading","Getting Feed ", true);
    }
    protected String doInBackground(String... arg0) {
        getContent();
        return null;
    }
    }

现在,如果我有 Internet 连接,它可以正常工作,但是当我失去连接时,它会杀死我的应用程序并显示错误“应用程序无响应”

为什么我不想依赖连接管理器

Connectivity Manager 只是寻找 Internet 连接,如果我在代理后面运行并且我需要登录到我的代理服务器才能访问 Internet,该怎么办?

有什么办法至少可以防止我的应用程序被杀死。

4

1 回答 1

2

快速回答

当然,处理 try/catch 块上的异常:即使 IDE 不会告诉您函数抛出异常,它们也可以被引发,事实上这似乎是您现在的情况。

尝试在完全脱机的情况下运行您的应用程序,并将引发异常的每一行包装在一个 try/catch 块中(当然,只要您捕获所有异常,整个“违规”代码的单个 try/catch 就足够了)。


技巧和窍门

至于不想依赖ConnectivityManager?这是个坏主意。ConnectivityManager 可能无法像大学代理等那样处理边缘情况,但它仍然是一个保护层。您不想浪费宝贵的计算时间来启动您可以提前知道的连接总是会失败,特别是在手机上。

专业提示:在将下载的字符串提供给 XML 解析器之前,您可能想检查自己代码中是否存在代理,只需检查第一行。如果该 Web 服务输出正确的 XML,它很可能包含类似的内容

<?xml version="1.0" encoding="UTF-8" ?>

所以如果第一行不是以类似的东西开头,你可以确定它不是XML。

相反,您可以通过检查请求的第一行是否类似

<!DOCTYPE....

或者

<html....

这非常简单,它是 http 代理的经典行为。

检查此链接(特别注意 readTwitterFeed() 方法)。即使它不是用于 XML,它也会帮助您了解如何在 Android 上完成标准 RESTful WebService 调用(至少是一种方式)。同样,只需将该 RESTful 调用的输出插入我上面描述的过滤器,然后插入您最喜欢的 XML 解析器(假设输出确实通过了这些卫生检查)。

底线是:不要让自己的工作变得更加困难。不要重新发明轮子并以聪明的方式使用你可用的东西。

干杯。

于 2013-01-17T09:48:03.093 回答