假设有个新闻列表,打开之后会启动一个线程联网读取新闻json,要是数据还没有读取完,用户就把这个ui(activity或者viewcontroller)关闭或者按home键隐藏了app,那么请问在这种情况下该怎么处理这个线程?(应该就是俗称的幽灵线程问题吧)我搜了很多文章(android、ios),有几个大概的观点,这里列出来还请大神们指点下
1.用try..catch,如果网络线程的onsuccess里面有ui操作,就try..catch包围。
2.自己做过isDestory符,线程里判断
3.用Loader,不需要管这种事了(android)
4.用线程池,自己写一个也行,用个KV结构维护一个线程id表,onpause、ondestory或者viewdiddisapper等ui要销毁(隐藏)的时候将线程池内的线程销毁
5.在网络线程的onsuccess里加类似getActivity==null这样的判断
6.用订阅(Rxandroid或者ReactiveCocoa)不用管
这个完全取决于实现的方式,比如你有一个网络线程访问网络,然后更新列表。界面销毁了,请问你是否还要在被销毁的界面更新列表?而你有一个网络线程访问网络,目的是同步本地数据,那么是否要在调用的界面被销毁时去中断线程?
这些终究是开发者决定的,因为你需要线程活着,所以他才活着,你要关闭,那么他就关闭了。
和功能的需求是相关的,比如你举的例子,列表还没读完,按了home键,那么网络线程还继续吗?
这种销毁属于需要恢复的销毁,称之为不可见,不可见时通常会考虑继续访问网络,如果中断网络,那么等到界面可见了就有需要恢复网络访问,界面更新和网络访问就在一种平衡中进行显示,这完全取决于开发者的要求,而不是一尘不变的,因为界面销毁了,自然网络请求就要中断,或者就要继续。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。