android.os.NetworkOnMainThreadException 异常处理

问题描述:

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

2. 采用异步方式:

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

3. 采用线程的方式(与第二种类似,都是异步的方式)

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

你可能感兴趣的:(android,exception)