【问题标题】:how to run a algorithm on a separate thread while updating a progressBar如何在更新进度条时在单独的线程上运行算法
【发布时间】:2020-10-31 04:44:56
【问题描述】:

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

public void startSearch()

我可以像这样在单独的线程中运行它

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

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

还有其他方法吗?

【问题讨论】:

    标签: android multithreading progress-bar linear-search


    【解决方案1】:

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

    • 构建一个新线程或线程池,执行繁重的工作并使用主循环器的处理程序更新 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 抱歉,使用“复杂”是指算法太大,无法在 UI 线程中运行,应用在 UI 线程中时会冻结
      • 如果你的意思是花时间,那么你使用什么并不重要,因为它不在 UI 线程上运行。如果你在退出应用程序时仍想运行,你可以从前台服务启动你的线程.如果多个线程在你的codem中竞争相同的资源,更喜欢使用协程或rxjava。由于后台服务有adrod 8.0的限制并且你不想使用前台服务,那么如果你的任务不紧急,你可以使用wORKManager API代替服务。
      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2015-09-03
      相关资源
      最近更新 更多