android.os.NetworkOnMainThreadException 异常处理

本文介绍了如何解决在Android 4.0及以上版本中遇到的NetworkOnMainThreadException异常问题。主要探讨了三种解决方案:使用StrictMode策略监测不当操作、通过AsyncTask实现异步网络访问以及利用独立线程执行网络任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

###问题描述:

在android 4.0上运行时报android.os.NetworkOnMainThreadException异常


原因:

在4.0中,访问网络不能在主程序中进行


解决方法:

有三个方法可以解决

  1. 使用StrictMode:

这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码。

//安卓2.3以后访问网络增加内容  
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
              .detectDiskReads()  
              .detectDiskWrites()  
              .detectNetwork()  
              .penaltyLog()  
              .build());   
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
            .detectLeakedSqlLiteObjects()  
            .detectLeakedClosableObjects()  
            .penaltyLog()  
            .penaltyDeath()  
            .build());  
  1. 采用异步方式:

    private class MyOnclickListener implements OnClickListener{
    @Override
    public void onClick(View v) {
    new MyTask().execute();
    }

    private class MyTask extends AsyncTask<Integer, Integer, Integer>{
    @Override
    protected Integer doInBackground(Integer… params) {

         String url="http://maps.googleapis.com/maps/api/geocode/json?" +  
                 "latlng=35.95405270,117.30649970&sensor=false";  
                 
         //创建一个Httpclient对象  
         HttpClient httpClient=new DefaultHttpClient();  
         String responseData="";  
         
         try {  
             //向指定的Http地址发送请求  
             HttpResponse httpResponse=httpClient.execute(new HttpPost(url));  
             
             //取得服务器返回的响应  
             HttpEntity httpEntity=httpResponse.getEntity();  
             BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(httpEntity.getContent()));  
             String line="";  
             while((line=bufferedReader.readLine())!=null){  
                 responseData=responseData+line;  
             }  
         } catch (ClientProtocolException e) {  
             e.printStackTrace();  
         } catch (IOException e) {  
             e.printStackTrace();  
         }  
         
         Gson gson=new Gson();  
         TestResult result=gson.fromJson(responseData, TestResult.class);  
         System.out.println(result.toString());  
         return null;  
     }  
    
  2. 采用线程的方式(与第二种类似,都是异步的方式)

    protected void onCreate(Bundle savedInstanceState) {{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // 启动线程执行下载任务
    new Thread(downloadRun).start();
    }

    /**

    • 下载线程
      */
      Runnable downloadRun = new Runnable(){
      @Override
      public void run() {
      // TODO Auto-generated method stub
      updateListView();
      }
      };

注意:后面两种方法,若要刷新UI线程,需要使用runOnUiThread,否则会出现错误 Can't create handler inside thread that has not called Looper.prepare()


转载自:http://daoshud1.iteye.com/blog/1843655

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值