Android在异步任务中创建Http连接的正确方法

时间:2013-01-17 09:32:49

标签: android android-asynctask

我在Async任务中运行一个函数来从我的服务器上的url获取feed,它可以工作但是当没有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;
     }
}

比我在异步任务中运行此功能

ASYNC TASK

    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连接,如果我在代理后面运行,我需要登录到我的代理服务器才能访问Internet?

有没有办法至少阻止我的申请被杀。

1 个答案:

答案 0 :(得分:2)

快速回答

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

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


提示和技巧

想要依赖ConnectivityManager?这是个坏主意。 ConnectivityManager可能无法处理大学代理和诸如此类的边缘情况,但它仍然是一个保护层。你不想浪费宝贵的计算时间,你可以事先知道总是失败,特别是在手机上。

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

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

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

相反,您可以通过检查请求的第一行是否已被劫持到代理登录页面中来了解

<!DOCTYPE....

<html....

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

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

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

干杯。