在多线程中,子线程更新主线程ui有哪些方法及注意点?
我先给你个提示。android只能用ui线程(即主线程)更新ui。让我们这样说:ui线程==主线程。
1.如果要在子线程中的数据发生变化时更新主线程的ui,可以使用消息机制以及消息和处理程序的组合。
2.还可以使用特定的控制方法,例如listview适配器中的notifydatachang()。好像就是这个方法
3。在视图中,还可以在数据更改后使用invalidatea()或postinvalidata()。
基本上,我希望我能帮助您解决这些常见问题。我们来讨论一下。
okhttp3几个简单的例子和在子线程更新ui线?
okhttp与httpurlconnection一样,是面向java的,并执行套接字层操作。当使用okhttp时,应该在子线程中调用它,并通过处理程序将结果发送到主线程。nohttp和volley不是套接字层的东西。它们可以直接在主线程中调用,并在获得结果后直接更新ui,而无需使用处理程序。它非常简单,但是,我建议使用nohttp。原因是nohttp封装了以下功能:文件下载、断点续传、304缓存、302/303参数传输、文件传输、请求头、多文件上传、大文件上传、cookie自动管理等。这些函数是截取的,但不是截取的。当我们使用volley时,我们需要编写大量的代码来再次封装它们,而且volley使用httpclient来解析。在android6.0删除httpclient之后,我们不能在6.0下使用volley的源代码,所以我们最好使用nohttp。nohttp兼容2.0-6.0或更高版本,而okhttp需要自己封装,而且继android4.4之后,nohttp也使用okhttp作为底层,在uikit这样大的框架中保证线程安全是一项主要任务,这将带来巨大的成本。uikit不是线程安全的。如果在两个线程中设置相同的背景图像,程序将崩溃,因为背景图像被释放两次。或者一个线程遍历以找到一个子视图,但该子视图在另一个线程中被删除,这将导致混乱。apple可以将大多数绘图方法和类(如uicolor)重写为线程安全的,但仍建议将ui操作保留在主线程中。事实上,如果要更新子线程中的其他ui,必须等到子线程结束,并且响应用户单击的按钮的ui更新是及时的。无论是在主线程还是在子线程中,它都没有什么意义,因为子线程中的所有其他ui更新都必须等到子线程的生命周期结束。在子线程中更新ui是不可能的。我们看到的ui更新是在执行子线程的代码之后,它自动进入主线程并在子线程中执行ui更新的函数堆栈。两者之间的时间非常短,这使得人们错误地认为线程分割过程可以更新ui。如果子线程一直在运行,则无法通知子线程中ui更新函数堆栈的主线程,即无法更新。只有少数用户界面可以直接更新,因为打开一个线程,就会得到当前的环境。例如,当点击一个按钮时,这个按钮的响应方式是打开一个子线程,子线程中这个按钮的ui更新可以及时完成,比如改变上面的背景图片,但是没有任何意义。
原文标题:ui控件有哪些 在多线程中,子线程更新主线程ui有哪些方法及注意点?,如若转载,请注明出处:https://www.saibowen.com/news/17929.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「赛伯温」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。