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