预备知识:
一、android每个客户端分为两条线程:
1.主线程:负责生成主界面,并响应用户动作,并且把用户输入的数据写入socket对应的输出流。
2.子线程:负责读取从服务器发送过来的数据,并且显示到程序界面上。
二、Handler消息传递机制
(一)Handler的两个作用:
1.在新启动的线程中发送消息。
2.在主线程中获取、处理消息。
(二)Handler相关的几个组件:
1.Message:Handler接收和处理的消息对象。
2.Looper:每个线程只能拥有一个Looper。
主线程(UI线程)中,系统已经初始化一个Looper对象,所以主线程中只出现Handler,没有出现Looper。
子线程中,程序猿需要自己创建一个Looper,先后顺序为:Looper.prepare(); Handler handler=new handler(){.......}; Looper.loop();
其中prepare()方法保证每个线程最多只有一个Looper对象;loop()方法是用一个死循环不断取出MessageQueue中的消息,并将取出的消息分给该消息对应的Handler进行处理。
3.MessageQueue:消息队列,采用先进先出的方式来管理Message。
三者关系:
MessageQueue是通过Looper来管理Message的,即,Looper是赋予了MessageQueue的先进先出功能。
Handler是对消息进行处理的。
三、关于BufferedReader的作用
1.首先它是一个缓冲区;而rendline()方法:会在读取到换行字符时候,会将整行字符串传入。
2.这个东西只有在socket(服务器传向客户端)把数据传出客户端时候用到,其作用是把服务器传过来的数据(s.getInputStream())通过InputStreamReader进行转换成字符串流。方便后面handler对其进行处理!
整理下多线程客户端的思路:
1.Activity ( UI见面的设计
+处理从服务器传来的消息的Handler
+定义与服务器通信的子线程(ClientThread clientThread=new ClientThread(handler))
+启动clientThread线程 new Thread(clientThread).start();
+监听器(例如发送消息)
);
2.子线程ClientThread
(定义一个向ui线程发送信息的handler和接收ui线程的信息的两个handler
+run()方法{ 链接服务器ip和端口
+获取从服务器发来的信息br=new BufferedReder(new InputStreamReader(s.getInputStream()));
+启动一条子线程读取服务器传来的数据(包括标记并且传入message,然后发送给handler)
}
+为当前线程初始化Looper.prepare();
+创建Handler对象:对从UI线程传来的信息做处理并且写入网络中传给服务器
+Looper.loop();
);