Android主线程不能访问网络异常解决办法

2016-01-23 21:51:12|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:Java, Android|来源:唯设编程网

今天在Android上使用jsoup实现网页解析,但是每当执行到如下语句的时候,程序就会崩溃:

Document doc2 = Jsoup.connect(strURL)
// .data("query", "Java")//请求参数
        .userAgent("Mozilla")// 设置urer-agent
        .cookie("auth", "token")// 设置cookie
        .timeout(50000)// 设置连接超时
        .post();

通过不断排查,终于找到了原因:Android默认情况下,主线程是不能访问网络的。

1. Android主线程不让访问网络的原因:

由于对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程 就会出现假死的现象,产生很不好的用户体验。所以,默认的情况下如果直接在主线程中访问就报出了这个异常,名字是NetworkOnMainThreadException

2. Android主线程不让访问网络的解决法

1). 启动一个独立线程

启动一个新线程的代码:

new Thread(){

    @Override
    public void run() {
        Dosomething();
        handler.sendEmptyMessage(0);

    }
}.start();

此处我们重写了线程类的run方法,执行Dosomething. 在里面还有个handler对象,这又涉及到了跨线程修改UI元素内容的问题。在java中是不允许跨线程修改UI元素的,如我们在新启动的线程中想去修改UI主线程中TextView的文本时,会报错误的。如果想做这样的操作,我们就得借助Handler这个类来实现。 关于这个handler类的用法,我们单独的再来写一篇博客进行介绍。

2) 异步调用的方法 AsyncTask

这里关于AsyncTask 介绍的文章不错, 详细情况看作者的介绍吧 
http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html#2824345
接下来也将会有一篇博客专门介绍 关于更新主线程UI线程的所有办法

3) StrictMode修改默认的策略

在我们的Activity类的onCreate方法中,设置如下规则:
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

这样也可以解决这个问题

关于StrictMode的具体介绍,请看另一个博客介绍的非常详细:

http://hb.qq.com/a/20110914/000054.htm

本文参考:http://www.cnblogs.com/lyroge/p/3837902.html

发表评论0条 】
网友评论(共?条评论)..
Android主线程不能访问网络异常解决办法