Android主线程无法使用socket的解决方法

android4.0以后就不能在主线程中初始化socket
解决方法一:引入StrictMode类:防止中断抛出异常
说明:StrictMode是一个开发者工具类,从Android 2.3平台开始被引入。可以用于捕捉发生在应用程序UI主线程中耗时的IO操作、网络访问或方法调用;也可以用来改进应用程序,使得UI主线程在处理IO操作和访问网络时显得更平滑,避免其被阻塞,导致ANR警告。
当StrictMode检测到指定的事件发生时,它以指定的方式通知你:崩溃,弹出对话框,闪屏,logcat,dropbox。

在主线程中加入下列代码即可:
public void onCreate() { if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() // 捕捉读取磁盘 .detectDiskWrites() // 捕捉写入磁盘 .detectNetwork() // 捕捉网络访问或使用detectAll() 火力全开,就要这个即可 .penaltyLog() // 捕捉LogCat日志 .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); } super.onCreate(); }

解决方法二:新开一个线程,在该线程中创建socket

new Thread() {
@Override
public void run() {
// 执行完毕后给handler发送一个空消息
try {
// 实例化Socket
Socket socket = new Socket(HOST, PORT);
// 获得输入流
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
line = br.readLine();
br.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendEmptyMessage(0); //不需要界面变化的话可不写handler
}
}.start();

private Handler handler = new Handler() {
@Override
// 当有消息发送出来的时候就执行Handler的这个方法
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 处理UI
txt.setText(line);
Log.i(“PDA”, “—–>” + line);
}
};

你可能感兴趣的:(android开发)