我整个上午都在研究Android线程和锁的工作方式。我已阅读有关Thread
,Runnable
,Handler
,AsyncTask
,Executors
,HandlerThread
,ThreadPoolExecutor
等的内容。我还阅读了Condition
,Lock
和方法synchronize
。但是,我仍然不确定应该在应用程序中使用哪种类型的线程。
总结和简化,我的应用程序应执行以下操作:
工作线程将附加到特定的
Fragment
,该线程显示带有不同元素的GridLayout
。该线程应生成与每个网格元素相对应的随机数,然后将其顺序发送到父级Fragment
,这将为其隐藏一定的毫秒数。但是,当用户单击Fragment
中的按钮时,线程应该能够暂停自身(需要一种同步用法)。
问题如下:
就目前而言,我正在考虑扩展原始Thread
类并使用synchronize()
来检查状态,但是我觉得这不是实现此目的的最合适方法。
谢谢。
答案 0 :(得分:1)
我认为RxJava
非常适合此问题。我离开了我的IDE,但是我设想您可以在哪里:
为网格布局中的每个单个项目(例如GridItemViewModel
)创建一个具有随机间隔的“计时器”,并使其在完成时发出该项目。
将所有这些计时器组合到List
中。
同时运行所有计时器。
每个单独的计时器结束时,会发出其“项目”(即ViewModel
)。使用它可以在您的用户界面中隐藏适当的项
onComplete()
中触发Observable
。调用此命令后,您知道所有任务都已完成。所以...
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*/);