因为从Honeycomb SDK(3.0)开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在Main Thread类中,其实本来就不应该这样做,直接在UI线程进行网络操作,会阻塞UI、所以,也就是说,在Honeycomb SDK(3.0)以下的版本,你还可以继续在Main Thread里这样做,在3.0以上,就不行了
直接在main Thread 进行网络操作的方法,网上给出的(亲测有效):
在发起Http请求的Activity里面的onCreate函数里面添加如下代码:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads()
.detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
再import即可
再附上一个socket的小案例:
public class SimpleClient extends Activity{
EditText show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.net);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads()
.detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
show = (EditText) findViewById(R.id.show);//用于显示页面的文本框
try {
Socket socket = new Socket("172.16.0.83",30000);//服务器的IP地址和端口(端口一般要大于1024,
// 避免与其它应用程序的通用端口冲突,且范围在整数0~65535之间有效)
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = br.readLine();
show.setText("来自服务器的数据:"+line);
br.close();//关闭输出流
socket.close();//关闭Socket
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}