zoukankan      html  css  js  c++  java
  • Android4.0 主线程不能访问网络异常解决办法

    从两个方面说下这个问题:

    1. 不让访问网络的原因

    2. 解决该问题的办法

    不让访问网络的原因:

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

    解决该问题的办法

    1. 独立线程

    2. 异步线程AsyncTask

    3. StrictMode修改默认的策略

    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);

    或者:

    if (Build.VERSION.SDK_INT >= 11) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads ().detectDiskWrites().detectNetwork().penaltyLog().build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
    }

    这样也可以解决这个问题

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

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

  • 相关阅读:
    Spark笔记:RDD基本操作(下)
    Spark笔记:RDD基本操作(上)
    使用mapreduce计算环比的实例
    Hbase学习笔记01
    周爱民:真正的架构师是没有title的(图灵访谈)
    google map 路线服务
    Google Maps V3 之 路线服务
    CSS3支持box-flex弹性布局
    php curl用法
    .frm,.myd,myi转换为.sql导入数据库
  • 原文地址:https://www.cnblogs.com/huidaoli/p/4139316.html
Copyright © 2011-2022 走看看