利用Java的事件在Android中进行webservice的异步调用

昨天折腾完Android调用webservice之后,差不多11点了,于是就把apk放到安装android4.x版本的手机准备真机实测一下,之前在2.3版本上测试没啥问题,没想到4.x上还真出问题了!由于太晚了,今天还得上班,就决定今晚回来搞定。
今天打开eclipse,连接手机debug模式调试了一下,结果提示:android.os.NetworkOnMainThreadException,一搜,结果是说4.x版本的系统为了保证UI操作的流畅性,默认是不允许直接在主线程中进行网络连接下载等操作的,当然有两种方法可以解决:
一种是添加如下的类似代码:

这种方法我觉得是Android在执行的时候进行一种安全保护,以避免在执行耗时操作时用户盲目的操作导致各种错误,还是在主线程中执行,因为我本来就想改成多线程执行,只是没想这么早,真是逼我这么做啊,也就是下面的方法:
添加一个新的线程操作,然后操作结束后发送空消息通知主线程操作结束,进而让主线程做出各种处理,这时候我想到,这个更.NET下的异步操作回调很像啊!

因为我这个下载类会在很多页面中用到,是一个公用的类,如果把多线程的操作在每一个调用的地方都实现一遍,实在是太多的重复了,就想把多线程的操作封装在整个下载类中,执行完毕后给调用方一个通知,然后执行相应的方法,所以就必须用到真正的事件特性了!

在.NET下注册一个时间是灰常简单的,不需要自己重新实现EventHandler(有必要的时候也是可以的),只需要简单的用event标记一个delegate类的实例即可,然后判断该事件是否被注册,如果被注册,就通知调用方,而添加事件到集合和对事件集的遍历是由.NET自动取完成的,只需要用+=之类添加,-=移除即可!

在JAVA下貌似没有这么“傻瓜式”特性了,必须自己去实现事件、监听器和事件源,并对事件源中事件注册方的管理,然后再事件完成之后,依次遍历去通知各个监听器,在调用方进行事件的重载。

所以对于一个事件,首先要继承EventObject类,重写里面的getSource方法,这样可以在调用发执行重载方法时获取到你想让他获取的东西:

当事件定义之后,就需要定义监听器,监听器就是用来看着这个事件的,并且提供一个可供覆盖的方法,让调用方在被通知后执行自己的操作。监听器就好比是小区的保安,如果有人来找你,就要给要给你打电话(可重载的方法),至于电话里面具体说什么,那就是你可以早早就跟保安说好了,比如要告诉你姓名,性别。事件源就是来访的人,整个事件的流程就是,你打电话给一个朋友(实例化一个事件源),让他来找你(执行来找你的方法),他到了之后,保安发现后(其实是他自己告诉保安-监听者-他要找人),就会问他的年龄之类的并且打电话告诉你(传递事件源,通知调用方)。
监听器就是继承EventListener的接口:

在事件源里面结合异步操作的方法,可以进行异步的下载操作,操作完毕后,通知调用方执行相应方法,同时把操作类传递给调用方,调用方获取操作类里面的数据就可以进行相应的操作了。

在getBitmap方法里操作结束后,发送一个空消息通知主线程操作的结束:

在事件源里定义一个私有变量,并且实例化的时候传入一个匿名方法,也就是收到执行完毕的消息后要执行的操作:

事件源还需要对所有注册方进行管理:

转载请注明来自清风阁。
参考文章:
Java中的事件:http://blog.sina.com.cn/s/blog_4ae536e401008g9b.html
关于Android4.x中出现上面所说异常的处理:http://blog.csdn.net/wotoumingzxy/article/details/7797295

利用Java的事件在Android中进行webservice的异步调用:等您坐沙发呢!

发表评论

点击正确的图片来提交评论:
快捷键:Ctrl+Enter