【问题标题】:Android : runOnUiThread not working, working if user touches screenAndroid:runOnUiThread 不工作,如果用户触摸屏幕工作
【发布时间】:2016-11-24 13:26:35
【问题描述】:

当我在后台线程中进行一些处理并想使用 runOnUiThread() 更新 UI 时,函数内的代码运行成功且没有任何错误,但只有在用户触摸屏幕时才会呈现 UI。否则,它会一直呈现。

为什么只有触屏后才渲染?

【问题讨论】:

  • 在渲染时,您的 Activity 会进入 onPause 吗?

标签: android android-runonuithread


【解决方案1】:

如果您的屏幕被另一个屏幕重叠,这是可能的。这导致 Activity 移动到暂停状态 (.onPause()) 方法。当你再次触摸它时,它再次变为前景,因此可以接收 UI 更新事件

【讨论】:

    【解决方案2】:

    有可能某个操作正在阻塞(例如过于频繁地通知适配器)您的 ui 线程并在发生中断时被解除阻塞。在您的场景中,触摸屏幕是一种中断。

    如果您粘贴您的代码,也许我们可以找到一个确切的解决方案。

    编辑:使用 RxJava 去抖动示例代码

              yourSearchObservable
                .throttleLast(100, TimeUnit.MILLISECONDS)
                .debounce(200, TimeUnit.MILLISECONDS)
                .onBackpressureLatest()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        searchResults -> {
                            // Your success
    
                       } ,
                        () -> {
                            // Error
                        }
                ));
    

    【讨论】:

    • 我想,这就是它的原因,因为它是以这种方式发生的。 1. 用户在搜索输入字段中输入。 2. 查询字符串传递给后台线程进行数据库查询。 3.数据库查询后,我在runOnUiThread()中设置适配器上的数据。由于我没有对搜索输入进行去抖动,因此在每次按下字符后,都会发生上述过程。在本地数据库中实现搜索并在列表视图上更新的最佳方法是什么。
    • 你可以去抖用户输入。例如,您可以在 1 秒后查询您的数据库并通知您的列表。顺便说一句,你能接受我的回答吗?谢谢。
    • 您可以发布代码以消除用户输入以进行搜索吗?因为我找不到有效的工作代码..
    【解决方案3】:

    尝试使用回调或 android.os.Handler.post() 与主线程交互

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      相关资源
      最近更新 更多