使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)

欢迎转载,请注明转载自微信订阅号(安卓编程入门进阶)。

百度云原清晰度地址:http://pan.baidu.com/s/1mhS0H8O

Socket通信在安卓中通常是以子线程的形式呈现,由于安卓机制限制子线程不允许更新UI线程。一方面UI线程中的空间句柄不允许在子线程中引用,另一方面,UI线程中采用阻塞的功能会导致程序抛出ANR错误。本次课程在上次课程实现单向通讯的基础上完成服务器端数据从子线程到前台界面的功能。实现方式是之前视频中介绍的回调函数。

1、  在服务器端的界面下方添加一个TextView的显示框,用于将服务器收到的数据呈现给用户。在MainActivity.java中为新加控件添加定义。

2、  新建CallBackMain的接口类,接口类中定义回调函数为CallbacktoMain(String answer),在Listener线程类中新加SetCallbacktoMain的注册函数。函数中传入接口实例。并在run方法接收到字符串数据之后使用调用接口类的回调方法,方法中传入接收到的数据。

使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)

使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)

3、由于在MainActivity.java中需要注册回调函数,所以需要获取到Listener的线程实例。因此在MainActivity.java中将Listener进行初始化操作,并且在启动StartServer线程时将Listener实例以构造函数传递参数形式传递到StartServer便于在StartServer的socket监听中获取到同一个Listener实例。

使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)

4、在MainActivity.java中使用Listener实例注册回调函数的监听任务,当服务器接收到数据的时候会调用回调函数并且回调函数中带有接收到的数据。由于回调函数还处于子线程中,无法更新UI,在MainActivity.java中初始化一个handler实例,重写handleMessage方法。在回调函数中将字符串装入bundle,再装入message,使用handler传递到UI现场,在UI线程使用接收到的数据刷新UI线程的界面。

使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)

PS:MainActivity.java中报错是由于Listener在声明之后没有实例化,这导致回调函数没法调用,所以报错,为了实例化对象,需要将Listener的socket构造函数删除而使用setSocket函数来传递。

OK,手机界面在电脑显示有些延时,,实际在手机上可以实时的跟踪的消息打印。。

使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)


                                                  更多最新安卓编程资料请关注微信公众号:安卓编程入门进阶                                            

                                           使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)