为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建侦听状态更改的线程?

如何创建侦听状态更改的线程?

摇曳的蔷薇 2022-09-21 16:41:53

我花了整个上午的时间弄清楚Android线程和锁是如何工作的。我读过 、 、 、 、 、 、 等。我还阅读了 有关 和 方法 。但是,我仍然对应该在应用程序中使用哪种类型的线程犹豫不决。ThreadRunnableHandlerAsyncTaskExecutorsHandlerThreadThreadPoolExecutorConditionLocksynchronize

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

工作线程将附加到特定的 ,该特定显示具有不同元素的 。该线程应生成与每个网格元素相对应的随机数,并将它们按顺序发送到父级,父级将隐藏它们固定的毫秒数。但是,当用户单击 中的按钮时,线程应该能够自行暂停(需要一种同步使用)。FragmentGridLayoutFragmentFragment

问题如下:

  1. 在我的情况下,哪种安卓线程是最佳的?

  2. 如果用户想要暂停线程循环内状态的更改,那么侦听它的最佳方法是什么?

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

提前致谢。


查看完整描述

1 回答

?
RISEBY

TA贡献1535条经验 获得超5个赞

我认为很适合这个问题。我不在IDE中,但我设想了一些东西,你:RxJava

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

  2. 将所有这些计时器组合到一个 .List

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

  4. 当每个单独的计时器完成时,它会发出其“项目”(即 )。使用它来隐藏 UI 中的相应项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*/);


查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信