首页 > 代码库 > android多线程-客户端

android多线程-客户端

预备知识:

一、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();

                        );