Bob*_*Bob 14 java android client-server
我正在构建一个Android应用程序,只要应用程序正在运行,它就会定期与服务器通信.
我通过在应用程序启动时启动与服务器的连接来执行此操作,然后我有一个单独的thread用于接收调用的消息ReceiverThread,这thread将从中读取消息socket,对其进行分析,并将其转发到应用程序的相应部分.
它thread在循环中运行,读取它必须读取的内容,然后阻止read()命令直到新数据到达,因此它将大部分时间用于阻止.
我处理通过另一个线程发送消息,称为SenderThread.我想知道的是:我应该SenderThread以类似的方式构建吗?我应该为这个线程维护一些形式的队列,让它发送队列中的所有消息,然后阻塞,直到新消息进入队列,或者每次需要发送消息时我应该只启动线程的新实例,让它发送消息,然后"死"?我倾向于第一种方法,但我不知道在性能方面(在内存中保持阻塞线程与初始化新线程)以及代码正确性方面实际上更好.
此外,由于我的所有活动都需要能够发送和接收消息,我持有对我Application班级中两个线程的引用,这是一种可接受的方法还是我应该以不同的方式实现它?
我遇到的一个问题是,有时如果我关闭我的应用程序并再次运行它实际上有两个ReceiverThread实例,所以我得到一些消息两次.
我猜这是因为我的应用程序实际上没有关闭,前一个线程仍处于活动状态(在read()操作上被阻止),当我再次打开应用程序时,新线程被初始化,但两者都连接到服务器,所以服务器将消息发送给两者.有关如何解决此问题的任何提示,或者如何完全重新组织它以便它是正确的?
我试着查看这些问题,但发现了我的第一个问题的一些相互矛盾的例子,没有什么是有用的,适用于我的第二个问题......
Dar*_*ind 20
1.如果您确实需要不惜一切代价在服务器和客户端之间保持开放连接,那么您的方法是可行的.但是我会使用异步连接,比如向服务器发送HTTP请求,然后在服务器感觉到它时得到回复.
如果您需要在服务器回复客户在一段时间后,但你不知道什么时候,你也可以看看到谷歌云消息框架,它给您发送小邮件到您的客户以透明和一致的方式你的服务器.
在开发移动应用程序时,您需要考虑一些事情.
智能手机没有无穷无尽的电池.
智能手机的互联网连接有些不稳定,您将在不同时间丢失互联网连接.
当你始终保持与服务器的直接连接时,你的应用程序会继续发送保持活动的数据包,这意味着你会非常快地吸干手机.当互联网连接与移动宽带上的连接一样不稳定时,您有时会丢失连接并需要从中恢复.因此,如果您使用TCP是因为您希望确保收到数据包,则会多次重新发送相同的数据包,因此会产生大量开销.
如果你自己打开服务器上的线程,你也可能会遇到服务器端的线程问题.假设您有200个客户端同时连接到服务器.每个客户端在服务器上打开1个线程.如果服务器需要同时提供200个不同的线程,那么最终这对服务器来说可能是一个非常耗费性能的任务,您也需要自己做很多工作.
2.退出应用程序后,您需要在清理后进行清理.这应该在您的活动onPause方法中完成Activity.
这意味着,杀死所有活动线程(或至少中断它们),保存UI的状态(如果需要),并刷新和关闭与服务器的任何打开连接.
就使用Threads而言,我建议使用一些内置的线程工具,如Handler或实现AsyncTask.
如果你真的认为Thread是要走的路,我肯定会建议使用Singleton模式作为线程的"管理器".
此管理器将控制您的线程,因此您不会Thread在任何给定时间与服务器进行多次通话,即使您处于应用程序的另一部分.
就Application类实现而言,请查看Application类文档:
需要维护全局应用程序状态的基类.您可以通过在AndroidManifest.xml的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的过程时为您实例化该类.
通常不需要子类Application.在大多数情况下,静态单例可以以更模块化的方式提供相同的功能.
因此保持距离实现自己的客场Application类建议,但是如果你让你的一个Activities初始化自己Singleton的类来管理Threads,你可能(只是可能)遇到麻烦的连接,因为单可能"绑定"到特定的初始化Activity因此,如果特定Activity内容从屏幕上删除并暂停,则可能会被杀死,因此单身人士也可能被杀死.因此,初始化实现中的单例Application可能会有用.
对不起文字的墙,但你的问题是"开放式的",所以我试图给你一个有点开放式的问题 - 希望它有所帮助;-)
| 归档时间: |
|
| 查看次数: |
28669 次 |
| 最近记录: |