文档章节

android之android.os.NetworkOnMainThreadException异常

有资本再款
 有资本再款
发布于 2015/10/19 22:52
字数 599
阅读 2414
收藏 2

在MainActivity中加载网络图片,代码如下:

public class NetImageActivity extends Activity {

     String imageUrl = "http://content.52pk.com/files/100623/2230_102437_1_lit.jpg";   
     Bitmap bmImg;
     ImageView imView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imView = (ImageView) findViewById(R.id.imageViewId);
        imView.setImageBitmap(returnBitMap(imageUrl));   
    } 
       
    public Bitmap returnBitMap(String url){ 
        URL myFileUrl = null;
        Bitmap bitmap = null;  
        try {   
            myFileUrl = new URL(url);   
        } catch (MalformedURLException e) {
            e.printStackTrace();   
        }   
        try {   
            HttpURLConnection conn = (HttpURLConnection) myFileUrl
              .openConnection();   
            conn.setDoInput(true);   
            conn.connect();   
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();   
        } catch (IOException e) {
              e.printStackTrace();   
        }   
              return bitmap;   
    }   
}

报错,信息如下

 Caused by: android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
            at java.net.InetAddress.getAllByName(InetAddress.java:214)
            at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
            at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
            at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
            at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
            at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
            at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)

    android.os.NetworkOnMainThreadException是说不要在主线程中访问网络,这个是android3.0版本开始就强制程序不能在主线程中访问网络,要把访问网络放在独立的线程中。

    在开发中,为了防止访问网络阻塞主线程,一般都要把访问网络放在独立线程中或者异步线程AsyncTask中。

1、想要忽略这些强制策略问题的话,可以在onCreate()方法里面加上

StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

 并在方法上加上@SuppressLint("NewApi"),重试,OK。

2、将网络访问放到单独线程中:

public class NetImageActivity extends Activity {

    String imageUrl = "http://content.52pk.com/files/100623/2230_102437_1_lit.jpg";
    Bitmap bitmap;
    ImageView imView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imView = (ImageView) findViewById(R.id.imageViewId);
        Thread imageViewHander = new Thread(new NetImageHandler());
        imageViewHander.start();
    }


    class NetImageHandler implements Runnable {
        @Override
        public void run() {
            try {
                URL url = new URL(imageUrl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setDoInput(true);
                conn.connect();
                InputStream is = conn.getInputStream();
                bitmap = BitmapFactory.decodeStream(is);
                //发送消息,通知UI组件显示图片
                handler.sendEmptyMessage(0);
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 0){
                imView.setImageBitmap(bitmap);
            }
        }
    };

}

3、将网络访问放到异步任务AsyncTask中,代码如下:

public class NetImageActivity extends Activity {

    String imageUrl = "http://content.52pk.com/files/100623/2230_102437_1_lit.jpg";
    ImageView imView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imView = (ImageView) findViewById(R.id.imageViewId);
        loadImage();
    }

    private void loadImage() {
        new AsyncTask<String, Void, Bitmap>() {
            //该方法运行在后台线程中,因此不能在该线程中更新UI,UI线程为主线程
            @Override
            protected Bitmap doInBackground(String... params) {
                Bitmap bitmap = null;
                try {
                    String url = params[0];
                    URL HttpURL = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) HttpURL.openConnection();
                    conn.setDoInput(true);
                    conn.connect();
                    InputStream is = conn.getInputStream();
                    bitmap = BitmapFactory.decodeStream(is);
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return bitmap;
            }

            //在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,
            // 后台的计算结果将通过该方法传递到UI线程,并且在界面上展示给用户.
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                if(bitmap != null){
                    imView.setImageBitmap(bitmap);
                }
            }
        }.execute(imageUrl);
    }

}


本文转载自:http://www.tuicool.com/articles/E3umie

共有 人打赏支持
有资本再款
粉丝 5
博文 99
码字总数 16312
作品 0
黄冈
私信 提问
android异常:android.os.NetworkOnMainThreadException

报android.os.NetworkOnMainThreadException异常,经过查文档,原来是4.0系统不允许主线程(UI线程)访问网络,因此导致了其异常。在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕H...

天下杰论
2012/12/04
0
1
异常:android.os.NetworkOnMainThreadException

Android 4.1项目:使用新浪微博分享时报:   android.os.NetworkOnMainThreadException 网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求...

tfc
2013/01/04
0
0
android.os.NetworkOnMainThreadException异常处理

第一种: public void onCreate(Bundle savedInstanceState) { 在android 2.3上设计的下载程序,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,原来在4.0中,访问网......

蒲成林
2013/12/01
0
0
安卓问题总结( android.os.NetworkOnMainThreadException异常)

问题描述: android.os.NetworkOnMainThreadException异常(不要在主线程访问网络资源) 问题分析: 造成这种异常的原因是安卓版本问题(仔细研究错误原因是代码不符合Android规范),网上搜...

火龙战士
2015/01/30
0
3
android创建子线程问题

在Android上运行的,会抛出异常android.os.NetworkOnMainThreadException。实测确实不能创建线程。

牟凌涛
2013/11/26
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
9
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
5
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部