问题描述
我有一个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带有调度程序。您提到的是一种方法,但是如果您有多个相互依赖的线程,那么线程管理将变得更加棘手。在专业应用程序上,由于将来的可伸缩性,您可能希望避免使用前面提到的方法。