在android

时间:2015-08-19 17:51:09

标签: java android sockets socket.io android-lifecycle

我打算在this库的android中为基于聊天的应用程序实现Socket.io。据我所知,图书馆看起来很不错。我想知道如何在整个应用程序中始终保持单个套接字连接?在这里,我列出了实现的方法,其中我需要最好和最稳定的方式。

三种方式

MainApplication 类扩展应用

通过这种方式,我们有一个很好的范围,即在主线程(或应用程序的生命周期)中维护套接字连接,并且每当从活动中需要套接字实例时我们都可以轻松获得它。但它的主要线索也是问题所在。它可能会阻止主线程。

BoundService

通过这种方式,我们可以绑定服务与活动,我们可以简单地使用它。在单独的线程中执行是实现IO /网络调用的方法。但是交叉处理转移比在同一过程中直接访问更昂贵。

Singleton

在Singleton中维护连接也很有意义。但是我们不知道实例何时被进程杀死,因为它在活动生命周期中不起作用。

如果我有意义,请帮助我。如果没有评论出来。

修改

我给出了更适合我的答案。

4 个答案:

答案 0 :(得分:8)

首先,应用程序onCreate()与您的用例无关,因为在非服务代码中首次启动时,您无法在后台运行线程。< / p>

另外,我建议使用Google Cloud Messaging而不是创建自己的机制。最好是设备的电池续航时间和更少的代码供您处理。

如果您想完全自己实现该聊天,Service是您唯一的选择。你也可以将它与单身人士结合起来,但我不推荐这种方法。您可以使用广播和BroadcastReceiverServiceActivity之间进行通信,我认为它比绑定服务更容易,因为绑定到服务是异步的并且它会造成很多混乱简单的广播。

答案 1 :(得分:7)

维护socket连接的服务

根据Ofek Ron提到的Service BroadcaseReceiverBoundService相比是更好的想法。因为它是一个保持沟通的繁琐过程。我还建议使用pub/sub广播方式,例如OttoEventBus(我自己建议广场使用 Otto ,这是干净而精彩的api)。

OTTO的优点
1.清洁剂Api
2.您可以在任何ActivityFragmentService课程中订阅和发布。
3. 解耦。 (您必须在代码中尽可能少地耦合)。

还有一点是在START_STICKY中使用 onStartCommand() 来在销毁后启动服务。请参阅this参考。

启动服务的MainApplication

在扩展MainApplication的{​​{1}}中启动服务的最佳做法。因为当存在内存约束或用户强行从堆栈中关闭应用程序时,应用程序将被终止。因此,Application不会被频繁调用,就像我们在Activity中实现一样。

实施在线状态

您只需在onStartCommand()类中实现Application.LifeCycleCallbacks即可实现在线状态,该类具有活动的大部分生命周期回调,并将在回调中得到通知。通过这种方式,您可以简单地实现MainApplication状态,而无需任何锅炉板代码。 (如果有人需要帮助,请告诉我)。

上传或下载图像或文件。

最佳做法是Online实施,因为它在一个单独的线程中运行。我保证哪个会提供最佳性能,因为它由android本身处理,而不是像我们创建的线程。

答案 2 :(得分:1)

你可以结合第一种方式和第三种方式,如:

Socket中创建Application,并将其声明为static。因此,您可以在应用程序的每个位置维护和访问它们。不要忘记创建单独的Thread来执行网络操作,您可以使用ThreadPool来管理这些Thread。如果您要从Thread更新用户界面,可以使用HandlerMessage与用户界面Thread进行通信

答案 3 :(得分:0)

在创建自己的socket.io客户端实现之前,您应该给这个库一个机会:https://github.com/socketio/socket.io-client-java

我在我的一个项目中使用它与node.js服务器进行通信,该服务器工作得非常好。实际上,你的所有建议都是正确的,主要取决于你想要达到的目标。但是,一个上下文始终可用:应用程序上下文。因此,您应该在Application类中保留单例实例并通过getApplicationContext()获取。

用户的在线状态:在这里,您应该创建一个后台服务,该服务正在不断地监听用户状态。由于信息不多,这应该没问题,不应该耗费太多电池。此外,如果有可用的新信息,您可以发送标记,并且只有在有新内容的情况下,才会启动另一个接收新数据的线程。这样可以保持较低的数据。

聊天:只有在应用处于活动状态时才会传输聊天数据。所以,这应该在活动中完成。

服务和活动都可以从应用程序上下文访问socket.io客户端的单例实例。只要你不处理主线程上的任何复杂数据,一切都很好。因此,将您的调用包装到单独的线程中,只在实际需要时启动它们。