gpt4 book ai didi

java - 如何创建一个监听状态变化的线程?

转载 作者:行者123 更新时间:2023-12-02 10:03:01 26 4
gpt4 key购买 nike

我整个上午都在研究 Android 线程和锁的工作原理。我读过有关 ThreadRunnableHandlerAsyncTaskExecutorsHandlerThreadThreadPoolExecutor等等。我还阅读了ConditionLock 和方法synchronize。但是,我仍然犹豫应该在应用程序中使用什么类型的线程。

总结和简化,我的应用程序应该执行以下操作:

A working thread will be attached to a specific Fragment, which displays a GridLayout with different elements. That thread should generate random numbers that corresponds with each one of the grid elements and send them sequentially to the parent Fragment, which will hide them a fixed number of milliseconds. However, the thread should be able to pause itself when user clicks a button in the Fragment (requiring a kind of synchronized usage).

问题如下:

  1. 对于我的情况来说,哪种 Android 线程是最佳的?
  2. 如果用户想要暂停线程循环,监听线程循环内状态变化的最佳方法是什么?

目前,我正在考虑扩展原始Thread类并使用synchronize()来检查状态,但我觉得这不是最合适的方式来实现这一目标。

提前致谢。

最佳答案

我认为RxJava非常适合解决这个问题。我已经离开了 IDE,但我设想您可以:

  1. 为网格布局中的每个单独项目(例如 GridItemViewModel)创建一个具有随机间隔的“计时器”,并让它在完成时发出该项目。

  2. 将所有这些计时器合并到一个列表中。

  3. 同时运行所有计时器。

  4. 当每个单独的计时器完成时,它会发出其“项目”(即 ViewModel)。使用它来隐藏用户界面中的相应项目

  5. 当所有项目完成时,它将触发整个 Observable 中的 onComplete()。当调用此函数时,您知道所有任务都已完成。

所以...

final List<Observable<Item>> tasks = gridItems()
.stream()
.map(item -> {
final int seconds = ThreadLocalRandom.current().next(0, 5);
return Observable.timer(seconds, TimeUnits.SECONDS).map(ignore -> item);
})
.collect(Collectors.toList());

Observable.merge(tasks)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(item -> {
//One item has completed. Take the "item" value
// and use it to update your UI.
}, t -> { /*No error handling*/}, () -> /*All items finished*/);

关于java - 如何创建一个监听状态变化的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55497031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com