如何在更新 progressBar 时在单独的线程上 运行 算法

how to run a algorithm on a separate thread while updating a progressBar

我有一个 android 线性搜索算法来查找重复文件并将其打包到函数中

public void startSearch()

我能够 运行 在单独的线程中像这样

class ThreadTest extends Thread { 
public void run() {
startSearch()
}
}

但是当我尝试更新该线程中的进度条时,它抛出一个异常并说我 ui 线程只能触摸它的视图

还有其他方法吗?

复杂可以有不同的解释。最好的方法是让 Kotlin Courtines,RxJava 和你提到的 dispatchers.What 是一种方法,但如果你有多个线程相互依赖,那么线程管理就会变得更加棘手。在专业应用程序上,由于将来的可扩展性,您可能希望避免使用您提到的方法。

有很多方法可以做到这一点,其中一些已被弃用,一些给您的应用程序增加了不必要的复杂性。我会给你几个我最喜欢的简单选项:

  • 构建一个新线程或线程池,执行繁重的工作并使用主循环器的处理程序更新 UI:

      Executors.newSingleThreadExecutor().execute(() -> {
    
          //Long running operation
    
          new Handler(Looper.getMainLooper()).post(() -> {
              //Update ui on the main thread
          });
      });   
    
  • Post 将结果传递给 MutableLiveData 并在主线程上观察它:

      MutableLiveData<Double> progressLiveData = new MutableLiveData<>();
    
      progressLiveData.observe(this, progress -> {
          //update ui with result
      });
    
      Executors.newSingleThreadExecutor().execute(() -> {
    
          //Long running operation
    
          progressLiveData.postValue(progress);
      });
    
  • 导入 WorkManager 库为您的进程构建一个 worker 并观察主线程上的实时数据结果:https://developer.android.com/topic/libraries/architecture/workmanager/how-to/intermediate-progress#java