来自:http://www.2cto.com/kf/201402/281526.html

NetworkOnMainThreadException

extends RuntimeException

java.lang.Object
? java.lang.Throwable
  ? java.lang.Exception
    ? java.lang.RuntimeException
      ? android.os.NetworkOnMainThreadException

Class Overview


The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.

Also see StrictMode.

所以事情就很清楚了。一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。

解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。

第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐)
在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码

 
1
2
3
4
if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

第二种方法就是我使用的方法也是我要推荐的方法,将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.main_view);
    new Thread(runnable).start();
}
 
Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        Bundle data = msg.getData();
        String val = data.getString("value");
        Log.i(TAG,"请求结果:" + val);
    }
}
 
Runnable runnable = new Runnable(){
    @Override
    public void run() {
        // TODO: http request.
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("value","请求结果");
        msg.setData(data);
        handler.sendMessage(msg);
    }
}

上面是比较通用的方法,我的代码:

 
1
2
3
4
5
6
7
8
// Android 4.0 之后不能在主线程中请求HTTP请求
            new Thread(new Runnable(){
                @Override
                public void run() {
                    cachedImage = asyncImageLoader.loadDrawable(imageUrl, position);
                    imageView.setImageDrawable(cachedImage);
                }
            }).start();                         

最新文章

  1. mysql关联表的复制
  2. .NET 操作XML
  3. Hadoop日记Day12---MapReduce学习
  4. JS闭包中的this对象
  5. html之div拖拽,html5拖拽
  6. bean之间的关系:继承、依赖
  7. paip.提升性能---协程“微线程”的使用.
  8. sql中写标量函数生成大写拼音首字母
  9. Scrum Meeting---Eight(2015-11-3)
  10. nginx 搭配 lua
  11. request.getRequestDispatcher()和response.sendRedirect()
  12. hive 配置文件以及join中null值的处理
  13. 由chkconfig 引发的联想——怎么查看程序是否已经安装/成功安装
  14. JavaScript获取当前url根目录(路径)
  15. 值得关注的10个python语言博客
  16. oracle数据库删除数据恢复
  17. iOS - UITableView reloadData滚动到顶部无效问题解决
  18. 解放你生产力的10款效率工具,赶紧mark起来
  19. JQuery 获取页面某一元素在屏幕上的位置
  20. ionic创建工程中遇到异常、错误及解决方法

热门文章

  1. 关于.NET的配置文件
  2. vim自动补全
  3. bzoj 2705: [SDOI2012]Longge的问题 歐拉函數
  4. MySQL的if,case语句
  5. QT 读写二进制 (数值)高位在前
  6. SQL2000和SQL2005和SQL2008同时安装问题
  7. Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
  8. 一起啃PRML - Preface 前言
  9. About using UTF-8 fields in MySQL
  10. hdoj 2647 Reward【反向拓扑排序】