在 android 中实施 Socket.io 的最佳方式
Best way to implement Socket.io in android
我计划通过 this 库在 android 中为基于聊天的应用程序实施 Socket.io。据我了解,图书馆似乎还不错。我想知道如何在整个应用程序中始终保持 单个 套接字连接?在这里我列出了实现的方法,我需要的是最好的和稳定的方法。
三种方式
MainApplication Class 扩展 Application
通过这个我们有一个很好的范围,即套接字连接在主线程(或应用程序的生命周期)中维护,并且每当[=54]需要套接字实例时=] 我们可以很容易地得到它。但这也是问题所在的主线程。它可能会阻塞主线程。
绑定服务
通过这种方式,我们可以将服务与活动绑定,我们可以简单地使用它。在单独的线程中执行是实现 IO/Network 调用的方法。但是跨进程传输比同进程直接访问要贵
单例
在Singleton中维护连接也是有道理的。但是我们不知道实例什么时候被进程杀死,因为它在activity生命周期中不起作用。
如果我说的有道理,请帮帮我。如果不注释掉。
编辑
我已经给出了更适合我的答案
首先,应用程序的 onCreate()
与您的用例无关,因为当它首次在非服务代码中启动时,您不能在后台拥有线程 运行。
此外,我建议使用 Google Cloud Messaging 而不是创建您自己的机制。这对设备的电池寿命和更少的代码来说是最好的。
如果您确实想完全自己实现聊天,Service
是您唯一的选择。您也可以将它与单例结合使用,但我不推荐这种方法。您可以使用广播和 BroadcastReceiver
在 Service
和 Activity
之间进行通信,我认为它比绑定服务更容易,因为绑定到该服务是异步的,并且相比之下它会造成很多混乱到简单的广播。
您可以结合第一种方式和第三种方式,例如:
在您的 Application
中创建 Socket
并将它们声明为 static
。因此,您可以在应用程序的任何位置维护和访问它们。不要忘记创建单独的 Thread
来执行网络操作,您可以使用 ThreadPool
来管理这些 Thread
。如果您想从 Thread
更新您的 UI,您可以使用 Handler
和 Message
与 UI Thread
通信
在您创建自己的 socket.io 客户端实现之前,您应该给这个库一个机会:https://github.com/socketio/socket.io-client-java
我在我的一个项目中使用它与运行良好的 node.js 服务器通信。实际上,您所有的建议都是正确的,主要取决于您想要实现的目标。但是,始终有一个上下文可用:应用程序上下文。因此,您应该在 Application
class 中保留一个单例实例并通过 getApplicationContext()
.
获取它
用户的在线状态:在这里你应该创建一个持续监听用户状态的后台服务。由于信息不多,这应该没问题,应该不会耗尽电池太多。此外,如果有可用的新信息,您可以发送一个标志,并且仅当有新信息时,您才启动另一个线程,该线程正在接收新数据。这使数据保持低水平。
聊天:聊天数据仅在应用程序处于活动状态时传输。所以,这应该在 activity.
中完成
服务和 activity 都可以从应用程序上下文访问 socket.io 客户端的单例实例。只要您不在主线程上处理任何复杂数据,一切都很好。因此,将您的调用包装到单独的线程中,仅在实际需要时才启动它们。
维持socket
连接的服务
正如 Ofek Ron 所提到的 Service
和 BroadcaseReceiver
比 BoundService
更好 的想法。因为保持沟通是一个繁琐的过程。而且我也推荐pub/sub
的广播方式,比如Otto
或者EventBus
(我自己推荐的是Square的Otto,干净漂亮api).
OTTO 的优点
1. 清洁工 Api
2.您可以订阅和发布in/to任何Activity
,Fragment
,Service
class.
3. 解耦。 (您必须在代码中尽可能少地耦合)。
还有一点是在onStartCommand()
中使用START_STICKY
在服务被销毁后启动服务。请参阅 this 参考资料。
MainApplication 启动服务
最好在扩展 Application
的 MainApplication
中启动服务。因为当存在内存限制或用户从堆栈中强行关闭应用程序时,应用程序将被终止。所以 onStartCommand()
不会像我们在 Activity 中实现的那样被频繁调用。
实现在线状态
只需在MainApplication
class中实现Application.LifeCycleCallbacks
即可实现在线状态,其中包含activity的大部分生命周期回调,会在activity中得到通知回调。通过这种方式,您可以在没有任何样板代码的情况下简单地实现 Online
状态。 (如果有人在这里需要帮助,请告诉我)。
正在上传或下载图像或文件。
最佳做法是由 IntentService
实施,因为它 运行 在单独的线程中。我保证哪个会提供最好的性能,因为它是由 android 本身处理的,不像我们创建的线程。
我计划通过 this 库在 android 中为基于聊天的应用程序实施 Socket.io。据我了解,图书馆似乎还不错。我想知道如何在整个应用程序中始终保持 单个 套接字连接?在这里我列出了实现的方法,我需要的是最好的和稳定的方法。
三种方式
MainApplication Class 扩展 Application
通过这个我们有一个很好的范围,即套接字连接在主线程(或应用程序的生命周期)中维护,并且每当[=54]需要套接字实例时=] 我们可以很容易地得到它。但这也是问题所在的主线程。它可能会阻塞主线程。
绑定服务
通过这种方式,我们可以将服务与活动绑定,我们可以简单地使用它。在单独的线程中执行是实现 IO/Network 调用的方法。但是跨进程传输比同进程直接访问要贵
单例
在Singleton中维护连接也是有道理的。但是我们不知道实例什么时候被进程杀死,因为它在activity生命周期中不起作用。
如果我说的有道理,请帮帮我。如果不注释掉。
编辑
我已经给出了更适合我的答案
首先,应用程序的 onCreate()
与您的用例无关,因为当它首次在非服务代码中启动时,您不能在后台拥有线程 运行。
此外,我建议使用 Google Cloud Messaging 而不是创建您自己的机制。这对设备的电池寿命和更少的代码来说是最好的。
如果您确实想完全自己实现聊天,Service
是您唯一的选择。您也可以将它与单例结合使用,但我不推荐这种方法。您可以使用广播和 BroadcastReceiver
在 Service
和 Activity
之间进行通信,我认为它比绑定服务更容易,因为绑定到该服务是异步的,并且相比之下它会造成很多混乱到简单的广播。
您可以结合第一种方式和第三种方式,例如:
在您的 Application
中创建 Socket
并将它们声明为 static
。因此,您可以在应用程序的任何位置维护和访问它们。不要忘记创建单独的 Thread
来执行网络操作,您可以使用 ThreadPool
来管理这些 Thread
。如果您想从 Thread
更新您的 UI,您可以使用 Handler
和 Message
与 UI Thread
在您创建自己的 socket.io 客户端实现之前,您应该给这个库一个机会:https://github.com/socketio/socket.io-client-java
我在我的一个项目中使用它与运行良好的 node.js 服务器通信。实际上,您所有的建议都是正确的,主要取决于您想要实现的目标。但是,始终有一个上下文可用:应用程序上下文。因此,您应该在 Application
class 中保留一个单例实例并通过 getApplicationContext()
.
用户的在线状态:在这里你应该创建一个持续监听用户状态的后台服务。由于信息不多,这应该没问题,应该不会耗尽电池太多。此外,如果有可用的新信息,您可以发送一个标志,并且仅当有新信息时,您才启动另一个线程,该线程正在接收新数据。这使数据保持低水平。
聊天:聊天数据仅在应用程序处于活动状态时传输。所以,这应该在 activity.
中完成服务和 activity 都可以从应用程序上下文访问 socket.io 客户端的单例实例。只要您不在主线程上处理任何复杂数据,一切都很好。因此,将您的调用包装到单独的线程中,仅在实际需要时才启动它们。
维持socket
连接的服务
正如 Ofek Ron 所提到的 Service
和 BroadcaseReceiver
比 BoundService
更好 的想法。因为保持沟通是一个繁琐的过程。而且我也推荐pub/sub
的广播方式,比如Otto
或者EventBus
(我自己推荐的是Square的Otto,干净漂亮api).
OTTO 的优点
1. 清洁工 Api
2.您可以订阅和发布in/to任何Activity
,Fragment
,Service
class.
3. 解耦。 (您必须在代码中尽可能少地耦合)。
还有一点是在onStartCommand()
中使用START_STICKY
在服务被销毁后启动服务。请参阅 this 参考资料。
MainApplication 启动服务
最好在扩展 Application
的 MainApplication
中启动服务。因为当存在内存限制或用户从堆栈中强行关闭应用程序时,应用程序将被终止。所以 onStartCommand()
不会像我们在 Activity 中实现的那样被频繁调用。
实现在线状态
只需在MainApplication
class中实现Application.LifeCycleCallbacks
即可实现在线状态,其中包含activity的大部分生命周期回调,会在activity中得到通知回调。通过这种方式,您可以在没有任何样板代码的情况下简单地实现 Online
状态。 (如果有人在这里需要帮助,请告诉我)。
正在上传或下载图像或文件。
最佳做法是由 IntentService
实施,因为它 运行 在单独的线程中。我保证哪个会提供最好的性能,因为它是由 android 本身处理的,不像我们创建的线程。