如何在更新 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
我有一个 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