微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在更新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 举报,一经查实,本站将立刻删除。