文档章节

android之android.os.NetworkOnMainThreadException异常

有资本再款
 有资本再款
发布于 2015/10/19 22:52
字数 599
阅读 2406
收藏 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.os.NetworkOnMainThreadException异常处理

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

蒲成林
2013/12/01
0
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异常)

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

火龙战士
2015/01/30
0
3
android 4.0下访问主进程访问网络和开启另外另外的线程

在android 2.3上设计的下载程序,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,原来在4.0中,访问网络不能在主程序中进行,有两个方法可以解决,一个是在主程序中增...

天空下的
2013/01/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
4
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
122
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
4
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部