避免主线程访问网络操作UI以及解析XMLDemo

之前遇到一个问题,给我一个接口,接口请求到的数据是xml返回的,那么我需要解析这个xml;其次,我直接写的网络请求忘记主线程不能直接访问网络等耗时操作;最后又犯了一个错误在主线程里直接操作了UI。真是犯错毫不手软啊,怀疑自己不带脑子了.....

    /**
     * date: 2017/6/14 11:16
     * autour: HelenChen
     * description: 网络访问 天气数据
     */
    private void weatherDataServer() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
//            String url = "http://php.weather.sina.com.cn/xml.php?city=%c0%d6%c6%bd&password=DJOYnieT8234jlsK&day=0";
                    String strCity = URLEncoder.encode("乐平", "GB2312");
                    String url = UrlManager.WeatherInfo + "&day=0" + "&city=" + strCity;
                    String aa = weatherData(url);
                    Log.i("天气url ", url);
                    Document doc = DocumentHelper.parseText(aa);
                    Element foo = doc.getRootElement();
                    Iterator it = foo.elementIterator();
                    final HashMap<String, String> weatherMap = new HashMap<String, String>();
                    while (it.hasNext()) {
                        Element weather = (Element) it.next();
                        List weatherAttrs = weather.attributes();
                        Iterator itt = weather.elementIterator();
                        while (itt.hasNext()) {
                            Element weatherChild = (Element) itt.next();
                            Log.i("解析天气1 ", weatherChild.getName() + "\t\t\t" + weatherChild.getStringValue());
                            weatherMap.put(weatherChild.getName(), weatherChild.getStringValue());
                        }
                        Log.i("解析天气2 ", weatherMap.get("pollution_s"));
                        //操作UI
                        Message message = new Message();
                        message.what = SHOW_RESPONSE;
                        message.obj = weatherMap;
                        handler.sendMessage(message);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

/**
 * date: 2017/6/14 11:16
 * autour: HelenChen
 * description: 网络访问 天气数据
 */
private String weatherData(String url) {
    OutputStreamWriter out = null;
    BufferedReader in = null;
    StringBuilder result = new StringBuilder();
    try {
        URL realUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
        // 发送POST请求必须设置如下两行
        conn.setDoOutput(true);
        conn.setDoInput(true);
        // POST方法
        conn.setRequestMethod("GET");
        // 设置通用的请求属性
        conn.setRequestProperty("accept", "*/*");
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.setRequestProperty("user-agent",
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.connect();
        // 获取URLConnection对象对应的输出流
        out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
        // 发送请求参数
        // flush输出流的缓冲
        out.flush();
        // 定义BufferedReader输入流来读取URL的响应
        in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
        String line;
        while ((line = in.readLine()) != null) {
            result.append(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 使用finally块来关闭输出流、输入流
    finally {
        try {
            if (out != null) {
                out.close();
            }
            if (in != null) {
                in.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return result.toString();
}
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case SHOW_RESPONSE:
                HashMap<String, String> weatherMap = (HashMap<String, String>) msg.obj;
                fillView(weatherMap);
                break;
            default:
                break;
        }
    }
};

OK 仅此纪念没带脑子的自己.....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值