文章类型: ANDROID
关键词: 多个activity怎么共享一个socket,实际应用中怎么保持socket的长连接?
内容摘要: 多个activity怎么共享一个socket,实际应用中怎么保持socket的长连接?

多个activity怎么共享一个socket,实际应用中怎么保持socket的长连接?

2017/3/22 17:32:16    来源:apple    阅读:

在不同的activity中怎么公用一个socket,每次在不同的activity中发消息,都要new一个新的socket出来,很麻烦。。还有就是,实际应用中,如果一段时间不发消息,socket会被Android系统自动断掉,怎么才能保持socket的长连接呢?


答:可以使用Service来操作socket。多个activity统一跟service通讯进行操作。service保持对socket的操作就可以避免被干掉了


有三种方式可以解决问题


1:单例模式,即我的应用程序总共就只有一个这个类的实例


2:静态  你写一个类FatherConnect,这个类中有一个静态变量socket,一个静态方法对他进行初始化,然后在你需要的地方都应用这个类中的socket  这样可以保证所有的socket都是本socket,并且只有一个。


3:第三种方式是这样的,利用每个android应用程序都具有关联额应用程序对象这一事实。默认情况下,如果未定义自定义应用程序对象,android将使用android.app.Application,如果指定了的话,那么一个应用程序始终只有一个应用程序对象,所有组件都可以访问它


推荐第三种 因为这是符合android编程习惯的


service在android中既不是单独的进程,也不是线程,


Service是Android的四大组件之一,被用来执行长时间的后台任务,同样,线程也可以实现在后台执行任务,它们的区别在哪呢?何时使用Service何时使用Thread呢?今天我也来说说我的理解和总结。


首先,需要了解Service的几个特点。


(1) 默认情况下,Service其实是运行在主线程中的,如果需要执行复杂耗时的操作,必须在Service中再创建一个Thread来执行任务。


(2) Service的优先级高于后台挂起的Activity,当然,也高于Activity所创建的Thread,因此,系统可能在内存不足的时候优先杀死后台的Activity或者Thread,而不会轻易杀死Service组件,即使被迫杀死Service,也会在资源可用时重启被杀死的Service


其实,Service和Thread根本就不是一个级别的东西,Service是系统的四大组件之一,Thread只是一个用来执行后台任务的工具类,它可以在Activity中被创建,也可以在Service中被创建。因此,我们其实不应该讨论该使用Service还是Thread,而是应该讨论在什么地方创建Thread。


典型的应用中,它可以在以下三个位置被创建,不同的位置,其生命周期不一样,所以,我们应该根据该Thread的目标生命周期来决定是在Service中创建Thread还是在Activity中创建它。


(1) 在Activity中被创建


这种情况下,一般在onCreate时创建,在onDestroy()中销毁,否则,Activity销毁后,Thread是会依然在后台运行着。


这种情况下,Thread的生命周期即为整个Activity的生命周期。所以,在Activity中创建的Thread只适合完成一些依赖Activity本身有关的任务,比如定时更新一下Activity的控件状态等。


核心特点:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务,主动通知该Activity一些消息和事件,Activity销毁后,该Thread也没有存活的意义了。


(2)在Application中被创建


这种情况下,一般自定义Application类,重载onCreate方法,并在其中创建Thread,当然,也会在onTerminate()方法中销毁Thread,否则,如果Thread没有退出的话,即使整个Application退出了,线程依然会在后台运行着。


这种情况下,Thread的生命周期即为整个Application的生命周期。所以,在Application中创建的Thread,可以执行一些整个应用级别的任务,比如定时检查一下网络连接状态等等。


核心特点:该Thread的终极目标是为这个APP的各个Activity服务的,包括完成某个Activity交代的任务,主动通知某个Activity一些消息和事件等,APP退出之后该Thread也没有存活的意义了。


以上这两种情况下,Thread的生命周期都不应该超出整个应用程序的生命周期,也就是,整个APP退出之后,Thread都应该完全退出,这样才不会出现内存泄漏或者僵尸线程。那么,如果你希望整个APP都退出之后依然能运行该Thread,那么就应该把Thread放到Service中去创建和启动了。


(3)在Service中被创建


这是保证最长生命周期的Thread的唯一方式,只要整个Service不退出,Thread就可以一直在后台执行,一般在Service的onCreate()中创建,在onDestroy()中销毁。


所以,在Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接。


核心特点:该Thread可以为APP提供一些“服务”或者“状态查询”,但该Thread并不需要主动通知APP任何事件,甚至不需要知道APP是谁。


总之,我们不是要考虑该用Thread或者该用Service,而是应该为Thread选择合适的生命周期,这就是我对Service和Thread的思考和理解,


如果你的线程造成内存溢出,你的任务中有引用外部资源,并且你的资源没有被正常释放,造成你的任务永远不能结束。在有很多线程的场景用线程池更合适,让线程池自己去管理,你只管往里面增加任务就好了。

↑ 上一篇文章:Android 单个Activity后台运行,及Activity隐藏但是不调用OnDestory步骤 关键词:Android,单个Activity后台运行,及Acti.. 发布日期:2017/3/22 15:13:30
↓ 下一篇文章:卡夫卡散文《乡村大道上的孩子们》 关键词:卡夫卡散文《乡村大道上的孩子们》 发布日期:2017/3/27 19:08:22
相关目录:.NETANDROIDJAVA
我要评论
正在加载评论信息......