在2.x中访问网络不会出理Android.os.NetWorkOnMainThreadException异常,但在4.0版本中运行则会报此错误(在主线程访问网络时出的异常),
Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中
网上很多使用
// 详见StrictMode文档
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
这种方法解决,但detectLeakedClosableObjects() 会报错误,因为detectLeakedClosableObjects需要4.0以上的SDK,2.x中是没有的
接下来只能采用多线程解决
//定义线程
Runnable searchGooRunnable = new Runnable()
{
@Override
public void run()
{
// TODO Auto-generated method stub
try
{
Looper.prepare();
ProgressDialog.show(MainActivity.this, "查询", "正在连接服务器,请稍等");
Log.e("ycsmart", "开始线程执行");
...
Log.e("test", "线程执行结束");
Looper.loop();
} catch (Exception ex)
{
Log.e("test", ex.toString());
}
}
};
//定义消息接收
@SuppressLint("HandlerLeak")
private Handler hander = new Handler()
{
@Override
public void handleMessage(Message msg)
{
Log.e("test", "测试消息");
}
};
执行线程
new Thread(searchGooRunnable).start();
Thread中无法处理UI的更新,所以使用 Handler 来接受需要更新 UI 的消息