Android的socket编程注意点

解决了在Android 2.3下能够正常连接socket,而Android 4.4下却崩溃的问题。

首先连接的方法为

socket = new Socket();
SocketAddress socAdd = new InetSocketAddress("192.168.23.1", 30000);
socket.connect(socAdd, 5000);    //2.3正常4.4出错
2.3下正常连接,而4.4崩溃,一直找不到原因,后来google推荐最好不要在主进程中就进行socket连接


故编写了线程

    class MyThread extends Thread{
        MyThread(){
            super();
        }
        public void run(){
            try{
                socket = new Socket();
                SocketAddress socAdd = new InetSocketAddress("192.168.23.1", 30000);
                socket.connect(socAdd, 5000);    //2.3正常4.4出错
                os = socket.getOutputStream();
                is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                os.write("android\n".getBytes());   //测试连接
                os.flush();
                /*bundle.putString("msg", buffer.toString());
                msg.setData(bundle);
                myHandler.sendMessage(msg);*/

            }catch(SocketException se){
                se.printStackTrace();
            }
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }


线程在startButtonOnClikc时被调用

当时使用的调用方法为

   myThread = new MyThread();
   myThread.run();
结果仍然报错,socket.connect()连接不能,却没有捕获到socketConnectException异常
错误为android.os.NetworkOnMainThreadException

原来是使用Thread的run和start有区别

run仍然只有一个线程,而start才是真正的多线程


改成调用start()

单步调试能够通过start()

却在接下来的一步os.write("start connected")出错。

错误为java.lang.NullPointerException

且发现start()并没有向服务器写入android测试字符串


原来start调用后,run()尚未运行完,而主进程已经进行到下一行os.write(),

故os尚未对某一实例进行引用,仍未空指针。

将thread的创建改在startButtonOnClick之前,能够正常连接



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值