如何解决如何在更新progressBar时在单独的线程上运行算法
我有一个android线性搜索算法,用于查找重复文件并将其打包在函数中
public void startSearch()
我能够在这样的单独线程中运行
class ThreadTest extends Thread {
public void run() {
startSearch()
}
}
但是当我尝试更新该线程中的进度条时,它抛出异常,并说我ui线程只能触摸其视图
还有其他方法吗?
解决方法
执行此操作的方法有很多,其中某些方法已被弃用,有些方法给您的应用程序增加了不必要的复杂性。我要给您几个我最喜欢的简单选项:
-
构建一个新线程或线程池,执行繁重的工作并使用主循环程序的处理程序更新UI:
Executors.newSingleThreadExecutor().execute(() -> { //Long running operation new Handler(Looper.getMainLooper()).post(() -> { //Update ui on the main thread }); });
-
将结果发布到MutableLiveData并在主线程上对其进行观察:
MutableLiveData<Double> progressLiveData = new MutableLiveData<>(); progressLiveData.observe(this,progress -> { //update ui with result }); Executors.newSingleThreadExecutor().execute(() -> { //Long running operation progressLiveData.postValue(progress); });
-
导入WorkManager库为您的流程构建一个工作程序,并在主线程上观察实时数据结果:https://developer.android.com/topic/libraries/architecture/workmanager/how-to/intermediate-progress#java
复合物可以有不同的解释。最好的方法是让Kotlin Courtines,RxJava带有调度程序。您提到的是一种方法,但是如果您有多个相互依赖的线程,那么线程管理将变得更加棘手。在专业应用程序上,由于将来的可伸缩性,您可能希望避免使用前面提到的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。