Android学习笔记三十七:android socket开发错误笔记

来源:互联网 发布:米壹佰软件下载 编辑:程序博客网 时间:2024/05/21 22:05

android socket编程要点总结:

(1)从服务器发送给android时需要在发送的16进制串的最后加入0x0A,即换行符(因为android端接收函数中使用了readline,该函数通过读到/n表示读完一行)。
(2)创建socketk客户端必须在主线程之外,可以另外建立一个单独创建socket的线程,创建完后线程结束,获得socket对象。

(3)socket客户端接收必须放在一个线程中(出主线程外),因为它是阻塞式的;

(4)socket的发送可以在任意线程中;

(5)用户创建的线程是不能够直接操作UI控件的,必须通过Handler给UI线程发消息,然UI线程根据消息去所处理;但是可以读写全局变量;

(6)每个线程都有一个Looper,每个Looper对应一个MessageQueue,MessageQueue里存放多个Message;对MessageQueue的操作通过Handler,一个Handler只能对应一个MessageQueue;而一个MessageQueue可以有多个Handler。

(7)Handler将Message或者Runnable通过sendMessage()和post()发送到MessageQueue里(发送可以指定延时、发送时间以及携带Bundle数据)。当MessageQueue循环到Message,调用相对应的Handler对象的handlerMessage()方法进行处理;

(8)用户创建的线程是没有Looper的,所以想要启用Looper功能,首先调用Looper.prepare()然后进行处理,再调用Looper.loop(),Looper.loop()是一个循环,其后后面代码不会执行。当调用Handler.getLooper().quit()停止Looper;

(9)单独写一个java文件来封装新线程,一边处理服务器的socket数据。该java来使用了单子模式,因为与服务器的socket链接就一个,该类的1个对象就可以负责来自服务器的socket数据了,单子模式写法:
private static GWConnect GWConn =  new GWConnect(); 
还有一个全局成员变量:private Socket mySocket = null;    
在主线程中调用该类得初始化函数,函数中进行了socket连接的初始化,但是:初始后的mySocket不为null,但是new的GWConnect中的mySocket为null,后面在调用该单子对象的处理函数中总是出现空指针异常,原因就在此(对象成员变量初始化时里面的普通变量还没有初始化)解决方法是:调用类的初始化函数的时候,更新已经初始化的GWConn中的mySocket成员变量。该问题困扰我几个小时啊~~

0 0