首页 > ui被销毁时,访问网络的线程需要取消么?

ui被销毁时,访问网络的线程需要取消么?

ui被销毁,访问网络的线程需要取消么?

假设有个新闻列表,打开之后会启动一个线程联网读取新闻json,要是数据还没有读取完,用户就把这个ui(activity或者viewcontroller)关闭或者按home键隐藏了app,那么请问在这种情况下该怎么处理这个线程?(应该就是俗称的幽灵线程问题吧)
这里不想限制讨论android或者ios,希望能都听听大神们的思路

目前已知的思路

我搜了很多文章(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)不用管

求分享经验

现在说法太多了,求大神们分享下经验?如果是我现在的想法,有点想做第4种,自己写个小manager(单例模式保活)。

1.能留下你用的网络模块是什麽(如okhttp、volley、asynchttp、AFNetworking)
2.能给点demo代码说说思路
3.能说说优缺点

希望大神能讨论下,我是在github上找了很多项目型的开源项目看,在这个问题上处理也是比较模糊的。如果大神们恰巧看过处理的比较棒的项目型的项目,也求个链接学习下(android、ios均可),谢谢大家


这个完全取决于实现的方式,比如你有一个网络线程访问网络,然后更新列表。界面销毁了,请问你是否还要在被销毁的界面更新列表?而你有一个网络线程访问网络,目的是同步本地数据,那么是否要在调用的界面被销毁时去中断线程?

这些终究是开发者决定的,因为你需要线程活着,所以他才活着,你要关闭,那么他就关闭了。
和功能的需求是相关的,比如你举的例子,列表还没读完,按了home键,那么网络线程还继续吗?
这种销毁属于需要恢复的销毁,称之为不可见,不可见时通常会考虑继续访问网络,如果中断网络,那么等到界面可见了就有需要恢复网络访问,界面更新和网络访问就在一种平衡中进行显示,这完全取决于开发者的要求,而不是一尘不变的,因为界面销毁了,自然网络请求就要中断,或者就要继续。


我觉得这个和线程池没有什么关系啊
给线程发送中断信号或者自定义的信号,线程里面check中断信号或者自定义信号以及捕获中断异常(如果有的话),然后清理资源(关闭socket),然后线程自己退出。如果线程正好在更新UI,那要check UI是否还有效,一般UI的组件都有isDisposed之类的方法。


iOS,在基类重写 dealloc 方法
取消请求即可,为啥要取消线程

- (void)dealloc
{
    [[AFHTTPSessionManager manager] invalidateSessionCancelingTasks:YES];
}
【热门文章】
【热门文章】