2013年11月1日小光棍节java
有一段时间没有发表新的博客了,最近一直在忙着开发新浪微博客户端遇到不少问题比较头痛,好比说本篇博客要讲的NetworkOnMainThreadException这个异常,这是可能常常问题,在笔试题中也可能会问到,因此值得记录一下。网络
为何会出现这个异常,先解析一下它的字面意思,在主线程网络操做出现异常。很明显是在主线程也就是UI线程进行了比较耗时的网络操做,这种代码实现是不符合编码规范的, 由于在Android里在UI线程进行超过5秒的操做就好弹出ANR对话框,表示Android无响应。而且在Android2.3及以上引入了StrictMode这个类,是用来帮助开发者改进他们编写的应用,而且提供了各类的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,好比能够监视那些本不该该在主线程中完成的工做或者其余的一些不规范和很差的代码,因此才会报错。异步
小巫呢,最近在开发新浪微博客户端,须要进行网络操做就遇到了这个错误,刚开始还不清楚怎么解决,后来查了一下就明白是怎么回事了,Android4.0是不容许网络操做在主线程中进行的,那么怎么解决。很简单把网络请求操做经过异步的方式来作,Android能够用于进行异步操做的类有AsyncTack和Handler,具体想怎么用看项目要求。ide
使用Handler编码
方法1:Handler 子线程调用Handler的sendMessage(message)发送事件。 Handler handler= new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); //操做界面 textView.setText("zhangkai281"); } }; public class MyThread extends Thread { public void run() { // 耗时操做 loadNetWork(); Message msg = new Message(); handler.sendMessage(msg);//向Handler发送消息, } }
使用AsyncTaskurl
//UI线程中执行 new DownloadImageTask().execute( "www.91dota.com" ); private class LoadTask extends AsyncTask { protected String doInBackground( String... url ) { return loadDataFormNetwork( url[0] );//后台耗时操做 } protected void onPostExecute( String result ) { myText.setText( result ); //获得来自网络的信息刷新页面 }