在android中实现Socket.io的最佳方法

我打算在Android中通过这个库来实现基于聊天的应用程序的Socket.io。 据我了解图书馆似乎是相当不错的。 我想知道如何在整个应用程序中始终保持一个套接字连接? 在这里我列出了要实现的方法,我需要最好和稳定的方法。

三种方式

MainApplication类扩展了应用程序

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

BoundService

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

独生子

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

如果我有道理,请帮助我。 如果没有评论出来。

编辑

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

首先,应用程序的onCreate与您的用例无关,因为您在第一次启动非服务代码时无法在后台运行线程。

另外,我build议使用Google云消息传递,而不是创build自己的机制。 这将是最好的设备的电池寿命和less得多的代码来处理。

如果你确实想自己实现这个聊天,服务是你唯一的select。 你也可以把它和单例结合起来,但我不会推荐这种方法。 您可以使用广播和广播接收器来进行您的服务和活动之间的通信,我认为它比BoundService更容易,因为边界服务是asynchronous的,与简单的广播相比,它造成了很多混乱。

用于维护socket连接的服务

按照Ofek Ron的说法,使用BroadcaseReceivers的ServiceBoundService 更好 。 因为它是一个繁琐的过程来保持沟通。 而且我也推荐pub/sub的广播方式,比如Otto或者EventBus (我自己build议Square的Otto ,这个干净而精彩的api)。

OTTO的优点
1.清洁Api
2.您可以订阅和发布任何活动,片段,服务,类别。
3. 解耦 。 (你必须在代码中尽可能地less一些)。

还有一点是在onStartCommand使用START_STICKY在服务被破坏之后启动服务。 看到这个参考。

MainApplication启动服务

MainApplication extends Application中启动服务是最佳实践。 因为当存在内存约束或用户强制closures应用程序时,应用程序将被终止。 所以onStartCommand不会被频繁调用,就像我们在Activity中实现一样。

实现在线状态

你可以简单地通过在MainApplication类中实现Application.LifeCycleCallbacks来实现在线状态,这个类有大部分活动的生命周期callback,并且会在callback中被通知。 由此,您可以实现Online状态,而无需任何锅炉板代码。 (如果有人需要帮助,请告诉我)。

上传或下载图像或文件。

最佳实践是通过IntentService实现,因为它在单独的线程中运行。 我保证哪个会给出最好的性能,因为它是由android本身处理,而不是像我们创build的线程。

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

在您的Application创buildSocket并将其声明为static 。 所以你可以维护和访问他们在你的应用程序的每一个地方。 不要忘记创build单独的Thread来执行networking操作,您可以使用ThreadPool来pipe理这些Thread 。 如果您想从这些Thread更新您的用户界面,您可以使用HandlerMessage与UI Thread进行通信

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

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

用户的在线状态:在这里你应该创build一个后台服务,不断监听用户的状态。 由于没有太多的信息,这应该是好的,不应该耗尽电池太多。 此外,如果有新的信息可用,并且只有在有新的信息的情况下,才可以发送一个标志,然后启动另一个正在接收新数据的线程。 这使数据保持低水平。

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

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