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

时间:2019-04-03 14:01:53

标签: java android multithreading

我整个上午都在研究Android线程和锁的工作方式。我已阅读有关ThreadRunnableHandlerAsyncTaskExecutorsHandlerThreadThreadPoolExecutor等的内容。我还阅读了ConditionLock和方法synchronize。但是,我仍然不确定应该在应用程序中使用哪种类型的线程。

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

  

工作线程将附加到特定的Fragment,该线程显示带有不同元素的GridLayout。该线程应生成与每个网格元素相对应的随机数,然后将其顺序发送到父级Fragment,这将为其隐藏一定的毫秒数。但是,当用户单击Fragment中的按钮时,线程应该能够暂停自身(需要一种同步用法)。

问题如下:

  1. 哪种情况最适合我?
  2. 如果用户想暂停线程循环内状态的变化,最好的方法是什么?

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

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为RxJava非常适合此问题。我离开了我的IDE,但是我设想您可以在哪里:

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

    < / li>
  2. 将所有这些计时器组合到List中。

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

  4. 每个单独的计时器结束时,会发出其“项目”(即ViewModel)。使用它可以在您的用户界面中隐藏适当的项

  5. 所有项目完成后,它将在您的整体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*/);