Android学习笔记三十七:android socket开发错误笔记
2016-05-20 16:42
435 查看
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成员变量。该问题困扰我几个小时啊~~
(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成员变量。该问题困扰我几个小时啊~~
相关文章推荐
- Bolts-Android
- Android:从入门到改行
- android电池管理系统
- Android四种绑定监听事件的方式
- Android 一条竖线或横线、画边框
- Android创建和使用数据库SQLIte
- Android Studio导入项目的中文注释乱码解决方法
- u3d与android通信1
- Android Drawable Resources系列9:<scale>
- iPad、iPhone、Android 横屏、竖屏(window.orientation实现)的知识点
- Android手机闹钟服务AlarmManagerk开发案例
- [置顶] Android 自动更新 替代友盟自动更新
- Android:ViewPager中获取当前界面的Fragment
- 打造Android集合控件数据绑定(支持添加监听,支持AbsListView与RecycleView,支持异步加载等)(二)ORM注解以及解析
- Service与Android系统实现(1)-- 应用程序里的Service
- 【Android】22、活动的启动模式——singleInstance
- 【腾讯Bugly干货】Android性能优化典范之多线程篇
- Android Studio 快捷键使用
- Android 自定义日历控件
- 通过案例快速学会Picasso图片缓存库