`
handsomeliuyang
  • 浏览: 311886 次
  • 性别: Icon_minigender_1
  • 来自: 益阳
社区版块
存档分类
最新评论

Androidpn的框架浅析

阅读更多

开发部署方法:

  1. 下载androidpn的客户端和服务器:地址为:http://sourceforge.net/projects/androidpn/files/

  2. 解压服务器端,点击运行,访问:http://127.0.0.1:7070/user.do,就可以看服务器端的管理页面,用这个管理页面,就要向客户端push消息。

  3. 把客户端导入到eclipse工程中,修改raw/androidpn.properties文件中的xmppHost的值,如果在模拟器上访问就设置为10.0.2.2(详情请见:http://blog.csdn.net/android_tutor/article/details/4996752),如果是在手机上访问就设置为服务器的ip就行。

 

讲讲androidpn客户端的写法:

先从最关健的后台Service开始请起:

从类的层次看这个结构比较简单,让其变得复杂的是,其里面有三个线程:主线程,进行Xmpp通信线程,连接出错重试线程。

对上图进行说明:

  1. 在NotificationService里创建一个单线程,让其对服务器进行连接,由于使用Xmpp连接服务器要分为三步:连接,注册,登陆。所以用一个栈来保存要执行的Task任务(ConnectTask,RegisterTask,LoginTask),还后再按这个顺序进行执行。

  2. 连接Xmpp服务器的线程用的是Executors.newSingleThreadExecutor(),这个本身可以不停的submit任务,那为什么还要自己用一个栈来保存Task了,我的猜测是虽然可以不停的提交任务,但其执行顺序不能保证,哈哈,这个推测可能是错的。

  3. 连接线程在连接,注册,登陆的过程中,都有可能出错,都可能会失败,这时我就要有一个重连的机制,在Androidpn里开了另外一个线程来进行重试,其重试不是每次都按多少秒来进行重试,而是有其自己的规则。

 

private int waiting() {
	// 重试次数大于20次,其睡眠600秒
    if (waiting > 20) { 
        return 600;
    }
    // 重试次数大于13次,睡眠300秒
    if (waiting > 13) { 
        return 300;
    }
    // 重试次数小于等于7次,睡眠10秒,大于7次,睡眠60秒
    return waiting <= 7 ? 10 : 60;
}

 

 

  4. 在LoginTask里,如果登陆了服务器端,其就会注册一个监听器,用于监听服务器push的数据包(Packet),再通过发送广播的方式来通知要进行显示的程序。

  5. 在登陆服务器后,也有可能出错,所以在登陆后,会设置一个ConnectionListener,用于监听连接出错的时候,再合适重连线程,进行重连

  6. 在登陆过程中,有一种错误要单独处理,就是账号和密码无效的时候,这个时候其返回的状态码是401,这种情况应该把本地保存的帐号和密码都清掉,再重新进行连接,不然会永远都登陆不上服务器端。

 

其以上的线程写法不一定是最好的,我们也可以用Hander来进行重试,或者用TimeTask来管理线程也可以。

 

  • 大小: 7.7 KB
  • 大小: 19 KB
分享到:
评论
5 楼 kaicheng21 2013-01-16  
zpchuaqiune 写道
楼主说的不错,作者线程写法确实不是最好的,而且很容易出问题。为了维护任务的顺序,作者定义了一个标志 runing,但是我在测试的过程中发现如果突然断开网络,然后再连接网络,这时候它的重新连接几乎是不起作用的,因为它的runing没有控制好!建议大家在用的时候,把实现方式改掉

请问下怎么改呢?手机断网之后,客户端连不上服务端,必须要把客户端程序结束掉重新打开,才能重新连接上服务端。
谢谢!
4 楼 zpchuaqiune 2012-10-12  
楼主说的不错,作者线程写法确实不是最好的,而且很容易出问题。为了维护任务的顺序,作者定义了一个标志 runing,但是我在测试的过程中发现如果突然断开网络,然后再连接网络,这时候它的重新连接几乎是不起作用的,因为它的runing没有控制好!建议大家在用的时候,把实现方式改掉
3 楼 109492927 2012-09-19  
为什么连着发两条消息,收到后也是两条,但是一看都变成第二条了?
2 楼 lendau 2012-05-08  
楼主,我客户端代码怎么运行不起来啊?只改了ip
1 楼 wuzhi11love 2011-12-21  
顶楼主,目前小弟的水平还看不出androidpn-client管理线程的方法哪里不好。。。

相关推荐

Global site tag (gtag.js) - Google Analytics