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

 暧gx祢生 发布于 2022-10-31 09:01

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均可),谢谢大家

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

    2022-10-31 22:47 回答
  • iOS,在基类重写 dealloc 方法
    取消请求即可,为啥要取消线程

    - (void)dealloc
    {
        [[AFHTTPSessionManager manager] invalidateSessionCancelingTasks:YES];
    }
    2022-10-31 22:47 回答
  • 这个完全取决于实现的方式,比如你有一个网络线程访问网络,然后更新列表。界面销毁了,请问你是否还要在被销毁的界面更新列表?而你有一个网络线程访问网络,目的是同步本地数据,那么是否要在调用的界面被销毁时去中断线程?

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

    2022-10-31 22:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有